javascript - 如何使 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}
解决方案
你正在加倍然后/等待。使用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
。在代码的其他地方你有同样的东西。
我认为如果你像这样清理你的代码,你可以在承诺中解开你的承诺,这可能会解决你的问题。
推荐阅读
- javascript - Webpack如何将模块填充在窗口关闭中?
- python - 来自 url 的 Json - 数组中的数组
- docker - 有没有办法通过 Jenkins 插件将 docker 图像上传到工件?
- kubernetes - Google Kubernetes Engine Service loadBalancerSourceRanges 不允许在 IP 范围内连接
- python - 如何避免在 django 的测试目录中循环导入?
- lightgbm - LightGBM ranker 函数使用什么评估指标
- python - 当将字典键作为参数传递时,如何将函数结果返回到 Python 中的字典值?
- c# - 如何在 WPF 应用程序中的 SOAP 客户端的“Set-Cookie”标头响应的新请求中设置“Cookie”标头
- javascript - 使用 vue.js 从 api 调用中渲染转义的 HTML
- android - 使用 Retrofit2 从 json 资源中检索数据