在这种情况下,我们有一个 Promise 对象数组,必须按照数组中指定的确切顺序解析它们。此外,如果一个元素被拒绝,整个链应立即拒绝,从而防止进一步尝试解析后续元素。
以下示例展示了顺序执行 Promise 的手动迭代:
function processArray(array, fn) { var index = 0; function next() { if (index < array.length) { fn(array[index++]).then(next); } } return next(); }
这个函数接受一个数组和一个承诺返回函数 fn 作为参数。它迭代数组,在每个元素上调用 fn 并将结果传递给下一次迭代。
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 库提供了处理异步操作的便捷方法,包括顺序迭代。
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 语法,可以以更简洁易读的方式编写顺序异步操作:
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中文网其他相关文章!