首页 >web前端 >js教程 >如何在 JavaScript 中同步执行一系列 Promise?

如何在 JavaScript 中同步执行一系列 Promise?

DDD
DDD原创
2024-11-06 22:15:02309浏览

How to Synchronously Execute a Sequence of Promises in JavaScript?

如何同步 Promise 序列?

在这种情况下,我们有一个 Promise 对象数组,必须按照数组中指定的确切顺序解析它们。此外,如果一个元素被拒绝,整个链应立即拒绝,从而防止进一步尝试解析后续元素。

手动迭代

以下示例展示了顺序执行 Promise 的手动迭代:

function processArray(array, fn) {
  var index = 0;

  function next() {
    if (index < array.length) {
      fn(array[index++]).then(next);
    }
  }
  return next();
}

这个函数接受一个数组和一个承诺返回函数 fn 作为参数。它迭代数组,在每个元素上调用 fn 并将结果传递给下一次迭代。

将 .reduce() 与 Promise 结合使用

function processArray(array, fn) {
  return array.reduce((p, item) => {
    return p.then(() => {
      return fn(item).then((data) => {
        results.push(data);
        return results;
      });
    });
  }, Promise.resolve());
}

此方法使用 reduce() 方法累积一系列结果。数组中的每个项目都按顺序处理,从 fn 返回的 Promise 用于推进迭代。

使用 Bluebird Promise 库

Bluebird Promise 库提供了处理异步操作的便捷方法,包括顺序迭代。

Promise.mapSeries(arr, (item) => {
  // process each individual item here, return a promise
  return processItem(item);
}).then((results) => {
  // process final results here
}).catch((err) => {
  // process error here
});

Promise.mapSeries() 方法接受一个数组和一个 Promise 生成函数,并返回一个解析为解析结果数组的 Promise。

使用 ES7 async/await

使用 ES7 async/await 语法,可以以更简洁易读的方式编写顺序异步操作:

async function processArray(array, fn) {
  let results = [];
  for (let i = 0; i < array.length; i++) {
    let r = await fn(array[i]);
    results.push(r);
  }
  return results; // will be resolved value of promise
}

在此示例中,processArray 函数迭代数组,使用await暂停循环,直到从fn返回的每个promise都得到解决。

选择正确的方法

同步一系列promise的最佳方法取决于诸如数量等因素数组中的元素、处理函数 fn 的复杂性以及所需的错误处理行为。对于较小的数组和简单的处理函数,手动迭代或使用 Bluebird 的 Promise.mapSeries() 可能就足够了。对于更复杂的场景,使用 async/await 或最终答案中提供的自定义解决方案可能更合适。

以上是如何在 JavaScript 中同步执行一系列 Promise?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn