【发布时间】:2018-08-29 22:47:00
【问题描述】:
我有一个执行循环的 PHP 脚本(几千次)。每个循环都请求一个分页 URL,该 URL 以 JSON 格式返回一些结果。每个结果都需要至少 2 次进一步的 API 命中才能请求更多信息。完成所有这些后,我会将其构建成一个数据包以进行索引/存储。
在 PHP 中这很容易,因为它自然是同步的。
我正在将其转移到 NodeJS 设置中,并且发现很难在 NodeJS 中优雅地执行此操作。
如果我创建一个 for 循环,最初的 HTTP 请求(通常基于 Promise)将几乎立即完成,将请求的解析留给 Promise 处理程序。这意味着所有数千个页面请求最终都会被并行触发。这也意味着我必须在承诺解决方案中链接子请求(这会导致进一步的承诺链,因为我必须等待那些被解决)。
我尝试过使用 async/await 方法,但它们似乎不能很好地与 for 循环(或至少是 forEach)配合使用。
这大致就是我现在正在使用的,但我开始认为它完全错误,我可以使用回调来触发下一个循环?!
async processResult(result) {
const packet = {
id: result.id,
title: result.title,
};
const subResponse1 = await getSubThing1();
packet.thing1 = subResponse1.body.thing1;
const subResponse2 = await getSubThing2();
packet.thing2 = subResponse2.body.thing2;
}
(async () => {
for (let page = START_PAGE; page < MAX_PAGES; page += 1) {
console.log(`Processing page ${page}...`);
getList(page)
.then(response => Promise.all(response.body.list.map(processResult)))
.then(data => console.log('DATA DONE', data));
console.log(`Page ${page} done!`);
}
})();
【问题讨论】:
标签: javascript node.js asynchronous promise async-await