我必须为数组中每个项目的某些异步任务打电话给Promise,但我想串行执行这些任务。
Promise.all仅在具有合并了诺言列表但不按顺序调用它们的新诺言时才有用。
我如何在没有第三方库(例如Q,bluebird …)的情况下使用标准的Promise API来实现此目标。
您将诺言.then()与返回另一个诺言的回调一起使用。因此,假设您有三个函数a,b和c都返回了诺言。您可以像这样链接它们(按顺序执行):
.then()
a().then(b).then(c).then(function(result) { // all are done here });
如果您正在处理数组,并且myFunc要对数组中的每个项目调用一个promise-returning函数,则可以对数组使用标准设计模式,并且promise .reduce()可以一次遍历数组中的一个项目:
myFunc
.reduce()
var items = [...]; items.reduce(function(p, item) { return p.then(function() { return myFunc(item); }); }, Promise.resolve());
事实证明,这实际上只是.then()像第一个示例中那样链接了一堆处理程序,而是使用的结构.reduce()为您遍历数组。
从ES2017开始,您还可以使用async / await依次处理数组,如下所示:
async function processArray(arr) { for (let item of arr) { let result = await somePromiseReturningFunc(item); // do something with result here before // going on to next array item } return someFinalResult; } processArray(someArray).then(result => { // done processing array here }).catch(err => { // handle error here });