【问题标题】:Execute native js promise in series串行执行原生js promise
【发布时间】:2023-03-23 11:40:02
【问题描述】:

我必须为数组中的每个项目调用一些异步任务的承诺,但我想连续执行这些任务。

Promise.all 仅在有一个新的 Promise 时有用,该 Promise 合并了一个 Promise 列表,但它不会按顺序调用它们。

如何在没有 Q、bluebird 等第三方库的情况下使用标准 Promise api 实现这一点......

【问题讨论】:

  • 为什么 Promise.all 不能满足任务?
  • @tarini 看看this article。尤其是在“高级错误 #3:promises vs promise factory”部分。

标签: javascript node.js promise


【解决方案1】:

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

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

如果您正在处理一个数组,并且您有一个返回 promise 的函数 myFunc,您希望为数组中的每个项目调用该函数,您可以使用数组的标准设计模式和带有 .reduce() 的 promise 来遍历数组一次一个项目,如下所示:

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
});

【讨论】:

  • 添加了一个通过使用.reduce() 遍历数组来排序承诺的示例。
  • 添加了使用async/await串行处理数组的示例。
猜你喜欢
  • 1970-01-01
  • 2014-12-24
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 2019-04-17
  • 2017-06-09
  • 2016-03-11
  • 2018-11-08
相关资源
最近更新 更多