javascript - 异步函数不返回对变量/常量的解析
问题描述
我一直致力于制作一个简单的网络爬虫,以更深入地了解使用 async/await 和 promise/resolve 功能。我遇到了异步/等待函数没有正确返回我的解析的问题。我可以在返回解析之前 console.log 函数内的完整数据集,但我无法分配常量并在函数本身范围之外调用函数,并且 console.log 该数据(它以未定义的形式返回)。
这是应该返回我正在抓取的数据集的函数。saleHeaders 已成功提取,因为我能够抓取内容并将其分配给相应的常量。使用下面注释掉的 console.log 时,我得到了完整的数据集输出。
async function getInnerPosts(saleHeaders) {
await Promise.all(saleHeaders.map(async (job) => {
const dataSet = [];
return new Promise(resolve => {
request(job.fullURL, (err, res, html) => {
const $ = cheerio.load(html);
$('.result-info').each((index, element) => {
const postTitle = $(element).children(".result-title").text();
const postDate = $(element).children(".result-date").attr('title');
const postLink = $(element).children("a").attr('href');
const postPrice = $(element).children(".result-meta").children(".result-price").text();
const postLocation = $(element).children(".result-meta").children(".result-hood").text().replace(/[{()}]/g, '');
// gather data to one const
const fetchedData = { postTitle, postDate, postLink, postPrice, postLocation };
dataSet.push(fetchedData);
// console.log(dataSet);
});
return resolve(dataSet);
});
});
}));
}
但是当我尝试运行该函数,将其分配给一个常量,然后尝试记录该常量时,我得到了未定义的结果,而没有引发任何警告/错误。我试图重新构建数据集的返回结构并从头开始重新编写完整的函数,以确保我没有错过一些小错误,但没有运气。
async function scrapeData() {
const saleHeaders = await getForSaleHeader();
// Loop through the categories and pull the inner-data from the posts page
const innerPosts = await getInnerPosts(saleHeaders);
console.log(innerPosts);
}
这是运行上述代码示例时收到的时间和输出:
undefined
real 0m31.272s
user 0m33.594s
sys 0m0.322s
编辑 我也在调用整个脚本来运行:
// run the script
scrapeData();
解决方案
async function getInnerPosts(saleHeaders) {
// here
return await Promise.all(saleHeaders.map(async (job) => {
const dataSet = [];
return new Promise(resolve => {
您必须返回它,因为您想进一步使用函数外部的值。
const innerPosts = await getInnerPosts(saleHeaders);
如果你不这样做,你认为 的价值innerPosts
从何而来?它是从getInnerPosts
!
推荐阅读
- sqlite - 如何使用颤振在 sqflite 中存储多维数组?
- python - 如何通过数据类型转换(十进制)将 pandas 数据框转换为自定义嵌套字典列表
- mitmproxy - 如何使用 mitmdump 将 http2 翻译成本地 http?
- c - for 循环中的 fprintf 无法正常工作
- security - AWS Cognito 用户池和账户 ID
- ios - 如何在 Objective-C 中访问 Self 中的元素?
- javascript - 我正在寻找一个支持视频文件中的多个音轨/流的 web/html5/javascript 视频播放器
- python - 具有多个 iPyWidgets 下拉菜单的交互式 Covid 绘图
- c# - 在两个用户控件/视图之间传递数据
- python - 保存 Excel 操作未正确完成