javascript - 异步在运行前不等待函数
问题描述
我正在尝试从计算机上保存的 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;
}
解决方案
正如@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");
推荐阅读
- c# - 使用 Dapper 将大数组插入已声明的 SQL Server 表中
- r - dplyr 对数据框和数据库的工作方式不同 - 如何解决?
- python - 有没有办法在 Python 中使这个“for循环”更干净?
- javascript - Rails - 后退按钮复制元素
- android - 如何使用开关创建指纹锁以启用/禁用锁定
- render - 删除对象渲染
- flutter - 从互联网获取数据并推送到数组颤振
- kotlin - 将列表动态添加到 Kotlin 中的列表中
- amazon-web-services - TCP 连接锁定在“CLOSE_WAIT”状态,IIS 应用程序在 AWS 服务器上进行 Kerberos 身份验证(Windows 服务器 2016 标准)
- c++ - 对向量进行排序时的奇怪行为