我正在尝试从计算机上保存的HTML解析规范网站。我可以根据要求发布文件。
我很累,试图弄清楚为什么它不能同步运行。注释应首先记录CCCC
,然后记录BBBB
,最后记录AAAA
。
我正在运行的代码不会在第一个障碍上等待(它首先显示AAAA...
。我使用request-promise
的方式有误吗?发生了什么事?
这是由于.each()
的{{1}}方法引起的吗(我假设它是同步的)?
cheerio
答案 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