【问题标题】:What's the best design approach for NodeJS promised & loops? [duplicate]NodeJS 承诺和循环的最佳设计方法是什么? [复制]
【发布时间】: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


    【解决方案1】:

    我尝试过使用 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!`);
      }
    })();
    

    【讨论】:

      猜你喜欢
      • 2019-09-06
      • 1970-01-01
      • 2013-11-26
      • 2017-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 1970-01-01
      相关资源
      最近更新 更多