一尘不染

连续执行本机JS Promise

node.js

我必须为数组中每个项目的某些异步任务打电话给Promise,但我想串行执行这些任务。

Promise.all仅在具有合并了诺言列表但不按顺序调用它们的新诺言时才有用。

我如何在没有第三方库(例如Q,bluebird …)的情况下使用标准的Promise API来实现此目标。


阅读 219

收藏
2020-07-07

共1个答案

一尘不染

您将诺言.then()与返回另一个诺言的回调一起使用。因此,假设您有三个函数a,b和c都返回了诺言。您可以像这样链接它们(按顺序执行):

a().then(b).then(c).then(function(result) {
   // all are done here
});

如果您正在处理数组,并且myFunc要对数组中的每个项目调用一个promise-returning函数,则可以对数组使用标准设计模式,并且promise
.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
});
2020-07-07