首页 > 解决方案 > 如何使 axios.get 同步?

问题描述

这是我的 1337x.to 刮刀的 nodejs 代码。我想要做的是首先抓取运行良好的搜索结果,然后从这些搜索结果中获取种子的 url 并抓取似乎作为不同功能工作的磁铁 url 链接,但是当我试图在里面抓取这些值时getTorrent 函数,它只是返回未定义,我似乎无法存储这些值。谁能帮我这个?我只需要在返回之前将磁铁链接存储在数组中。

这是代码:

const axios = require('axios')
const cheerio = require('cheerio')

const baseurl = 'https://1337x.to'


var magneturl = 'sdkllfklajds'

var arr = []
var nameList = []
var urlList = []
var seedList = []
var leechList = []
var dateList = []
var sizeList = []

const getMagnet = (torurl) => {
    axios.get(torurl).then(({data}) => {
        var $ = cheerio.load(data)
        $ = cheerio.load($('.dropdown-menu').html())
        magneturl = $('a').last().attr('href')
    })
    return magneturl
}

const getTorrent = (searchurl) => {
    axios.get(searchurl).then(({ data }) => {
        const $ = cheerio.load(data)

        $('.coll-1.name').each((index, element) => {

            var tag = $(element).children('a').last()
            var name = tag.text()
            var url = tag.attr('href')

            getMagnet(url).then((data) => {
                urlList.push(data)
            })

            if(name.length) {
                nameList.push(name)
                //urlList.push(url)
            }
        })

        $('.coll-2').each((index, element) => {
            var seeds = $(element).text()
            if(index > 0)
                seedList.push(seeds)
        })

        
        $('.coll-3').each((index, element) => {
            var leeches = $(element).text()
            if(index > 0)
                leechList.push(leeches)
        })

        
        $('.coll-date').each((index, element) => {
            var dateAdded = $(element).text()
            if(index > 0)
                dateList.push(dateAdded)
        })

        
        $('.coll-4.size').each((index, element) => {
            var size = $(element).text().replace($(element).children('span').text(), '')
            sizeList.push(size)
        })

        var i = 0

        while(i < 20) {
            arr.push({name: nameList[i], url: baseurl + urlList[i], seeds: seedList[i], leeches: leechList[i], dateAdded: dateList[i], size: sizeList[i]})
            i = i + 1
        }
    
    })
    return arr
}

module.exports = {getTorrent, getMagnet}

标签: javascriptjquerynode.jsaxioscheerio

解决方案


你正在加倍然后/等待。使用await时可以这样做:

const getMagnet = async (torurl) => {
    var data = await axios.get(torurl)

     var $ = cheerio.load(data)
      $ = cheerio.load($('.dropdown-menu').html())
      magneturl = $('a').last().attr('href')
     return magneturl
}

基本上使用await直接的返回而不是在 a 中then。在代码的其他地方你有同样的东西。

我认为如果你像这样清理你的代码,你可以在承诺中解开你的承诺,这可能会解决你的问题。


推荐阅读