ES11 中 Promise.allSettled 方法的优化
Promise.allSettled() 是一个用于接受多个 Promise 实例并并行执行的静态方法。它的返回值是一个新的 Promise,它的状态由传入的所有 Promise 实例的状态决定。当所有 Promise 实例状态都变化时,allSettled() 返回的 Promise 实例会由 resolve() 方法改变其状态为fulfilled,并丢失了实例返回的值和排查 error 的职责,而是返回一个用于表示所有传入的 Promise 实例可用状态的 包含一个对象数组 Array<object> 的值。
常规用法:
const promise1 = Promise.resolve(3); const promise2 = new Promise((resolve, reject) => setTimeout(reject, 200, "rejected")); const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 100, "success")); Promise.allSettled([promise1, promise2, promise3]).then((results) => { console.log(results); });
结果输出:
[ { status: "fulfilled", value: 3 }, { status: "rejected", reason: "rejected" }, { status: "fulfilled", value: "success" } ]
对于处理单个 Promise 时,通常需要使用 Promise.reject() 或 Promise.resolve() 来解析 Promise 实例的状态,从而根据 Promise 返回的状态进行不同的处理。而 Promise.all() 可以同时处理多个 Promise,但只能处理状态位于 fulfilled 的 Promise 对象,无法处理出现 reject 异常的 Promise 对象。对比来看,Promise.allSettled() 不仅可以解决 Promise.all() 的局限性,更为重要的是可以提供更详细的处理信息。
ES11 的新特性进一步完善了 Promise.allSettle() API,引入了优化后的版本。在代码量不大的情况下,使用 forEach 循环的方式处理多个 Promise 是允许的,但个人认为使用 map() 会更为简洁优雅。
优化前:
-- -------------------- ---- ------- ----- -------- --------- - ----- ---- - ----------------------------------------------- ----- ---- - ----------------------------------------------- ----- ---- - ----------------------------------------------- ----- -------- - --------------------------- -- ----------------- ----- -------- - --------------------------- -- ----------------- ----- -------- - --------------------------- -- ----------------- ----- ------- - --- ------------------ ---------- ------------------ ---------- ------------------ ---------- ------ -------- - ------------------------ -- ----------------------
优化后:
-- -------------------- ---- ------- ----- -------- --------- - ----- ---- - - ----------------------------------------------- ----------------------------------------------- ---------------------------------------------- -- ----- -------- - -------------- -- -------------------------- -- ------------------ ----- ------- - ----- ----------------------------- ------ -------- - ------------------------ -- ----------------------
优化后的示例代码使用 map() 进行循环,将 Promise 异步请求与 allSettled() 结合使用。当 Promise 被处理完毕时,allSettled() 将要么返回包含对象数组的成功状态,要么返回对象数组的失败状态。我们可以使用 promise.status 来检查 Promise 是否被成功处理,如果 promise.status 为 fulfilled 则访问对象值 value,否则访问获取失败原因的原因 reason。
优化后的示例代码表明,通过 allSettled 方法的优化,可以更好地处理 Promise 的执行和状态,并且可以通过对象数组进一步优化对各状态的处理。
总结:ES11 引入的 Promise.allSettled() 方法,增强了 Promise 多个实例并行执行时掌握状态的方式,在处理 Promise 时更加高效简洁。在使用 Promise 中,我们也应该深入了解其API特性,以更好地应对项目中不断变化的需求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645b6eb5968c7c53b0dc417c