一尘不染

promise.all都在forEach循环中-一切立即触发

node.js

在Node应用程序中,我需要以同步方式遍历某些项目,但是循环内的某些操作是异步的。我的代码现在看起来像这样:

someAPIpromise().then((items) => {
   items.forEach((item) => {
      Promise.all[myPromiseA(item), myPromiseB(item)]).then(() => {
         doSomethingSynchronouslyThatTakesAWhile();
      });
    }
}

这可以弄清楚何时items是由1组成的数组。但是,一旦有多个项目,promise.all()将立即为该数组中的每个项目触发,而无需等待循环中的操作结束。

这么说…我如何确保数组中每个项目的整个操作都同步运行(即使某些操作是异步的并返回了Promise)?

非常感谢!

ñ


阅读 2019

收藏
2020-07-07

共1个答案

一尘不染

好的…我们能够使其工作的方式:在Promises的帮助下array.reduce()。最终结果:

myAsyncAPIcall.then(items => {
    items.reduce((current, nextItem) => {
        return current.then(() => {
          return new Promise(res => {
             Promise.all([myPromiseA(nextItem), myPromiseB(nextItem]).then(() => {
               someSynchronousCallThatTakesAWhile(nextItem);
               res();
             }).catch(err => {
                   console.log(err);
             });
          });
        });
    }, Promise.resolve())
})

它的工作方式是,通过将数组的每个项目包装在自己的Promise(resolve,reject)中,我们可以确保每次迭代都同步运行,因为一次迭代的完成将触发解决下一个Promise的需求,并且等等等等。在每个promise解决方案中,只要知道调用只能在父promise范围内,直到调用完成,就可以根据需要异步启动所有调用。

希望对大家有帮助!

2020-07-07