首页 > 解决方案 > 异步函数不返回对变量/常量的解析

问题描述

我一直致力于制作一个简单的网络爬虫,以更深入地了解使用 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();

标签: javascriptnode.js

解决方案


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!


推荐阅读