Как сделать синхронным ax ios .get? - PullRequest
0 голосов
/ 20 июня 2020

Это мой код nodejs для скребка 1337x.to. Я хотел сначала удалить результаты поиска, которые работали нормально, а затем, исходя из этих результатов поиска, получить URL-адрес торрентов и удалить ссылки url-адреса ma gnet, которые, казалось, работали как другая функция, но когда я попытался выбросить эти значения внутри функции getTorrent, она просто вернула undefined, и я не могу сохранить эти значения. Кто-нибудь может мне с этим помочь? Мне просто нужно сохранить ссылки ma gnet в массиве, прежде чем он будет возвращен.

Это код:

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}

1 Ответ

1 голос
/ 20 июня 2020

Затем вы удваиваете / await. При использовании 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 напрямую, а не в then. В другом месте кода у вас есть то же самое.

Я думаю, что если вы очистите свой код таким образом, вы сможете распутать свои обещания внутри обещаний, что может решить вашу проблему.

...