Promise 是一种在异步编程中使用的对象,可以用于异步计算。在 ECMAScript 6 中,Promise 已经被加入到了标准库中,成为了一种标准的异步编程方法。随着 ECMAScript 的版本升级,Promise 也在不断地完善和增加新的功能。在 ECMAScript 2020 中,Promise.allSettled 是其中一个新增的功能,并且是很有用的一个。
Promise.allSettled
Promise.allSettled 方法接收一个 Promise 数组作为参数,返回一个新的 Promise。这个新的 Promise 在所有的 Promise 都被 settled(fulfilled 或 rejected)之后才会被 resolved。它的 resolve 参数是一个由所有 Promise 的状态组成的数组,每个状态都包含以下对象:
- status(fulfilled 或 rejected)
- value(如果状态为 fulfilled,则包含 Promise 的解析值;否则为 undefined)
- reason(如果状态为 rejected,则包含 Promise 的拒绝原因;否则为 undefined)
下面是一个示例代码:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- -------- - --- ----------------- ------- -- ------------------ ---- ---------- ----- -------- - --- ----------------- ------- -- ------------------- ---- ---------- ----------------------------- --------- ----------------------- -- - --------------------- --- -- ------- -- - -- - ------- ------------ ------ - -- -- - ------- ----------- ------- ------- -- -- - ------- ------------ ------ ------- - -- -
与 Promise.all 的区别
Promise.all 方法接收一个 Promise 数组作为参数,返回一个新的 Promise。这个新的 Promise 在所有的 Promise 都被 fulfilled 之后才会被 resolved。它的 resolve 参数是一个由所有 Promise 的解析值组成的数组。
与 Promise.all 相比,Promise.allSettled 的优点在于:
- 程序可以检查每个 Promise 的状态。如果程序只关心已经 fulfilled 的 Promise,它可以使用 Promise.allSettled 来避免处理 rejection。
- 即使有一个 Promise 被 rejected,Promise.allSettled 仍然会等待所有 Promise 状态被 settled。
Promise.any 的优先级
与 Promise.any 方法相比,Promise.allSettled 的优先级较低。Promise.any 方法接收一个 Promise 数组作为参数,返回一个新的 Promise。这个新的 Promise 在 Promise 数组中第一个被 fulfilled 的 Promise 被 resolved 之后就会被 resolved。如果所有 Promise 都被 rejected,那么 Promise.any 方法返回一个 rejected Promise,其 reject 参数是一个 AggregateError 对象,包含了所有 Promise 的 reject 原因。
需要注意的是,Promise.any 方法不是 ECMAScript 2020 引入的新特性,而是 ECMAScript 2021 中新增的特性。
总结
在 ECMAScript 2020 中,Promise.allSettled 是一个非常有用的功能。它返回一个由所有 Promise 的状态组成的数组,可以让程序更好地管理多个异步任务的状态。与 Promise.all 方法相比,Promise.allSettled 的优点在于程序可以检查每个 Promise 的状态,即使有一个 Promise 被 rejected,它仍然会等待所有 Promise 状态被 settled。与 Promise.any 方法相比,Promise.allSettled 的优先级较低,但它是 ECMAScript 2020 中新增的特性。在实际开发中,根据需求合理地选择使用这些方法可以帮助我们更好地进行异步编程。
(完)
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ae248e48841e9894a21d93