什么是NodeJS承诺的最佳设计方法&循环?

时间:2018-03-20 23:28:54

标签: javascript node.js asynchronous promise async-await

我有一个PHP脚本循环(几千次)。每个循环都请求一个分页URL,该URL返回JSON中的一些结果。每个结果至少需要2次API命中才能请求更多信息。完成所有这些后,我将其构建为一个用于索引/存储的数据包。

在PHP中,这很容易,因为它自然是同步的。

我正在将其移至NodeJS设置并发现很难在NodeJS中优雅地执行此操作。

如果我进行for循环,初始HTTP请求(通常是基于承诺的)几乎会立即完成,将请求的解析留给promise处理程序。这意味着所有数千个页面请求最终会被并行触发。这也意味着我必须在承诺解决方案中链接子请求(这导致进一步的承诺链,因为我必须等待那些解析)。

我尝试过使用async / await方法,但是他们似乎不能很好地使用for循环(至少是forEach)。

这大致是我现在正在使用的,但我开始认为它完全错了,我可以使用回调来触发下一个循环?!

title

1 个答案:

答案 0 :(得分:2)

  

我尝试过使用async / await方法,但它们似乎不能很好地与for循环(或至少forEach)一起使用。

是的,async/await does not play nicely with forEach. Do not use forEach!但是将await置于正常的for循环中可以正常运行:

(async () => {
  for (let page = START_PAGE; page < MAX_PAGES; page += 1) {
    console.log(`Processing page ${page}...`);
    const response = await getList(page);
    const data = await Promise.all(response.body.list.map(processResult));
    console.log('DATA DONE', data);
    console.log(`Page ${page} done!`);
  }
})();