首页 > 解决方案 > 异步在运行前不等待函数

问题描述

我正在尝试从计算机上保存的 HTML 解析规范网站。我可以根据要求发布文件。

我已经筋疲力尽地试图弄清楚为什么它不会同步运行。评论应该CCCC首先记录 's,然后BBBB是 's,最后是一个 's AAAA

我正在运行的代码不会在第一个障碍处等待(它AAAA...首先打印)。我使用request-promise不正确吗?到底是怎么回事?

这是由于(我假设它是同步的)的.each()方法吗?cheerio

const rp = require('request-promise');
const fs = require('fs');
const cheerio = require('cheerio');

async function parseAutodeskSpec(contentsHtmlFile) {
  const topics = [];
  const contentsPage = cheerio.load(fs.readFileSync(contentsHtmlFile).toString());
  const contentsSelector = '.content_htmlbody table td div div#divtreed0e338374 nobr .toc_entry a.treeitem';

  contentsPage(contentsSelector).each(async (idx, topicsAnchor) => {
    const topicsHtml = await rp(topicsAnchor.attribs['href']);
    console.log("topicsHtml.length: ", topicsHtml.length);
  });

  console.log("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");

  return topics;
}

标签: javascriptnode.jsasync-awaitcheeriorequest-promise

解决方案


正如@lumio 在他的评论中所说,我也认为这是因为each功能是同步的。

您应该使用该map方法,并使用Promise.all()结果等待足够的时间:

const obj = contentsPage(contentsSelector).map(async (idx, topicsAnchor) => {
  const topicsHtml = await rp(topicsAnchor.attribs['href']);
  console.log("topicsHtml.length: ", topicsHtml.length);

  const topicsFromPage = await parseAutodeskTopics(topicsHtml)
  console.log("topicsFromPage.length: ", topicsFromPage.length);

  topics.concat(topicsFromPage);
})

const filtered = Object.keys(obj).filter(key => !isNaN(key)).map(key => obj[key])

await Promise.all(filtered)

console.log("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");

推荐阅读