异步在运行前不等待功能

时间:2018-11-06 16:17:23

标签: javascript node.js async-await cheerio request-promise

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

我很累,试图弄清楚为什么它不能同步运行。注释应首先记录CCCC,然后记录BBBB,最后记录AAAA

我正在运行的代码不会在第一个障碍上等待(它首先显示AAAA...。我使用request-promise的方式有误吗?发生了什么事?

这是由于.each()的{​​{1}}方法引起的吗(我假设它是同步的)?

cheerio

3 个答案:

答案 0 :(得分:1)

正如@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");

答案 1 :(得分:1)

尝试一下:

let hrefs = contentsPage(contentsSelector).map((idx, topicsAnchor) => {
  return topicsAnchor.attribs['href']
}).get()


let topicsHtml
for(href of hrefs){
  topicsHtml = await rp(href);
  console.log("topicsHtml.length: ", topicsHtml.length);
}

现在,等待在地图之外,或者每个都不像您所想的那样起作用。

答案 2 :(得分:1)

基于这里的其他答案,我得出了一个相当优雅的结论。请注意,在async回调中避免使用await / .map(),就像cheerio的回调一样(以及从我学到的async / {{ 1}},通常所有回调都似乎不能很好地尊重await的同步特性:

await