无论失败如何处理 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中文网其他相关文章!