首页 > 解决方案 > 如何将循环等待转换为 Promise.all?

问题描述

我正在转换一位同事的一些旧代码,我对 Javascript 并不陌生,但我很生疏,而且我对 Promises、Map 和其他新的 JS 功能不熟悉。

我需要将带有 a 的循环for转换为可用于更大 Promise 链的循环。awaitPromise

我认为答案是Promise.all和 a Map / Stream / Reduce(我仍在学习这是为了什么),但我看过的所有媒体文章都没有得到很好的解释(而且我可能不知道要搜索的正确内容)。

这是我正在转换的代码:

//foos and bars are global and can be used in the `then` after this promise resolves, 
//  so what the promise returns is unimportant

for (let bar of bars) {
    foos[bar] = await new MyClass(bar).myAsyncOperation();
}

如何转换循环,以便在循环中的所有项目都完成之前,promise 不会解决?

另外,我应该转换myAsyncOperation为返回 Promise 还是可以/应该将其保留为异步函数?

标签: javascriptpromiseasync-await

解决方案


Promise.all是要走的路:

Promise.all(bars
  .map(foo => new MyClass(foo).myAsyncOperation()))
    .then(results => {
      console.log(results)
    }
  );

推荐阅读