ECMAScript 2020 中的 Promise.allSettled 能力及使用场景
在现代的 JavaScript 中,Promise 对象已成为非常重要的异步编程方式。ES6 中的 Promise 已经提供了 then() 和 catch() 方法,用于处理异步操作的结果。ES2020 中引入的 Promise.allSettled() 方法扩展了 Promise 的能力,使得开发者能够更轻松地处理多个 Promise 对象的状态。
Promise.allSettled() 方法会返回一个新的 Promise 对象,并等待所有的 Promise 对象都已经 settle(fulfill 或 rejected)后,返回一个由所有 Promise 对象处理结果组成的数组。这是与 Promise.all() 方法的最大区别,因为 Promise.all() 方法会在任何一个 Promise 对象被 rejected 后立即返回 rejected 结果。
Promise.allSettled() 方法的语法如下:
Promise.allSettled(iterable)
其中 iterable 参数可以是具有迭代器接口的任何对象(Array、Set、Map 等)。
接下来,让我们看一些使用 Promise.allSettled() 方法的场景。
使用场景
- 处理多个 Promise 对象的结果
Promise.allSettled() 方法可以方便地处理多个 Promise 对象的结果。例如,我们可以使用 Promise.allSettled() 方法来确保所有的异步操作已完成,然后处理它们的结果。
-- -------------------- ---- ------- ----- -------- - ------------------- ----- -------- - ------------------ ---------------- ----- -------- - --- ----------------- ------- -- - ------------------- ----- --------- ----- - --------- --- ----------------------------- --------- ----------------------- -- - --------------------- ---展开代码
在上面的代码中,第一个 Promise 对象被 fulfilled,第二个 Promise 对象被 rejected,第三个 Promise 对象被 fulfilled。Promise.allSettled() 方法返回了一个由三个对象组成的数组,每个对象都包含了对应的 Promise 对象的状态和值或原因。
输出结果如下:
[ { status: 'fulfilled', value: 1 }, { status: 'rejected', reason: Error: error }, { status: 'fulfilled', value: 'resolved after 1 second' } ]
- 忽略 rejected 的 Promise 对象
如果我们希望只处理 fulfilled 状态的 Promise,而忽略所有 rejected 状态的 Promise,我们可以使用 Promise.allSettled() 方法与 Array.prototype.filter() 方法结合使用。
-- -------------------- ---- ------- ----- -------- - ------------------- ----- -------- - ------------------ ---------------- ----- -------- - --- ----------------- ------- -- - ------------------- ----- --------- ----- - --------- --- ----------------------------- --------- ---------- ------------- -- --------------------- -- ------------- --- ------------- ---------------------- -- - --------------------------------------- -- --------------- ---展开代码
在上面的代码中,我们使用 Promise.allSettled() 方法来获取所有 Promise 对象的处理结果,然后使用 Array.prototype.filter() 方法过滤掉 rejected 状态的 Promise 对象,最后输出 fulfilled 状态的 Promise 的结果。
输出结果如下:
[1, "resolved after 1 second"]
- 并行处理异步操作
我们可以结合 Promise.allSettled() 方法和 Async/Await 来并行处理异步操作。例如,我们可以使用 Promise.allSettled() 方法来并行处理多个请求,并等待所有请求都已响应后再处理响应数据。
-- -------------------- ---- ------- ----- -------- --------------- - --- - ----- ----------- - ------------ -- ------------ ----- --------- - ----- -------------------------------- ----- ---------------- - --------- ---------------- -- --------------- --- ------------ ------------- -- ----------------------- ----- ---------------- - ----- ------------------------------ ------ ----------------- - ----- ------- - --------------------- ------ --- - - ---------------------------------------------------------- --------------------------------------- -------------- -- ---------------------- ------------ -- ----------------------展开代码
在上面的代码中,我们使用 Promise.allSettled() 方法来并行发送多个请求,并等待所有请求都已响应后再处理响应数据。我们使用 Array.prototype.filter() 方法过滤掉 rejected 状态的 Promise 对象,使用 Promise.all() 方法等待所有请求数据都已解析,并将所有数据组成的数组返回。
总结
Promise.allSettled() 方法是一个非常实用的方法,可以让我们更轻松地处理多个异步操作的结果。它返回由所有 Promise 对象处理结果组成的数组,无论是被 fulfill 还是 reject。我们可以结合 Promise.allSettled() 方法和其他语言特性(如 Async/Await)来更方便地处理异步操作,提高代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64cc69555ad90b6d0428056d