首页 >web前端 >js教程 >如何在 JavaScript 中处理所有 Promise,甚至是那些失败的 Promise?

如何在 JavaScript 中处理所有 Promise,甚至是那些失败的 Promise?

Patricia Arquette
Patricia Arquette原创
2024-12-27 14:30:10216浏览

How Can I Process All Promises, Even Those That Fail, in JavaScript?

无论失败如何处理 Promise

在处理一组涉及网络请求的 Promise 时,通常需要处理某些请求的场景可能会失败。默认情况下,Promise.all() 在遇到第一次拒绝时提前终止。但是,在某些情况下,您可能希望等到所有 Promise 完成,即使是那些失败的 Promise。

推荐模式

一种方法是使用Reflect() 函数,它将 Promise 转换为 Promise,该 Promise 解析为具有已完成或已拒绝属性的状态对象。通过将数组中的 Promise 映射到 Reflect() 函数,您可以确保所有 Promise 完成,无论其状态如何。

const reflect = p => p.then(v => ({ v, status: "fulfilled" }), e => ({ e, status: "rejected" }));

Promise.all(arr.map(reflect)).then(results => {
  const success = results.filter(x => x.status === "fulfilled");
});

在此示例中,Promise.all() 与修改后的一系列 Promise,等待所有 Promise 完成。 success 数组将包含成功 Promise 的结果,使您能够优雅地处理网络故障,并仍然根据可用数据继续执行操作。

改进的解决方案 (Promise.allSettled)

内置于现代 JavaScript 中的是 Promise.allSettled,它提供了一种更简洁、更有效的方法来实现所需的行为。它返回一个解析为结果数组的 Promise,每个结果都包含已完成或拒绝的状态,无论 Promise 的结果如何。

Promise.allSettled([promise]).then(([result]) => {
  // reach here regardless
  // { status: "fulfilled", value: 33 }
});

以上是如何在 JavaScript 中处理所有 Promise,甚至是那些失败的 Promise?的详细内容。更多信息请关注PHP中文网其他相关文章!

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