浅析 ES11 的 Promise.allSettled API 及其与 Promise.all 的区别

阅读时长 5 分钟读完

前言

Promise 在 JavaScript 前端开发中广泛使用,它是一种异步编程解决方案,能够解决异步操作的问题。在 ES11(即 ECMAScript 2020)中,新增了 Promise.allSettled API,本文将深入探讨其与 Promise.all 的区别以及在实际开发中的应用。

Promise.allSettled 简介

Promise.allSettled 方法接受一个 Promise 数组作为参数,返回一个新的 Promise 数组,该数组的处理程序在所有 Promise 解决或被拒绝后执行。返回的 Promise 数组的每个元素都是一个对象,该对象表示对应的输入 Promise 是否已成功解决或被拒绝,并且包含 Promise resolve 或 reject 的结果。所有 Promise 的处理程序都完成后,Promise.allSettled 的处理程序会执行。

该方法具有以下特点:

  • 接受多个 Promise 实例作为参数,以数组的方式传递。
  • 无论 Promise 实例的状态是 resolved 还是 rejected,都会返回 Promise 实例的数组,即使其中某个 Promise 实例被 reject。
  • 返回的 Promise 实例的数组中每个元素都是一个对象,该对象表明一个 Promise 实例的状态和结果,它的属性有 status,表示 Promise 实例的状态,有两种取值:"fulfilled" or "rejected",reason 表示 Promise 实例返回的数据或者 reject 的原因。

示例代码如下:

-- -------------------- ---- -------
----- -------- - -------------------
----- -------- - --- ----------------- ------- -- ------------------ ---- --------------
----- -------- - --- ----------------- ------- -- ------------------- ---- --------------

----------------------------- --------- ----------
  ------------- -- ----------------------
-- ------- 
-- -
--   - ------- ------------ ------ - --
--   - ------- ----------- ------- ----------- --
--   - ------- ------------ ------ ----------- -
-- -

Promise.all 简介

Promise.all 方法接受一个 Promise 数组作为参数,返回一个新的 Promise 对象,只有所有 Promise 都被 resolved 时,返回的 Promise 才会被 resolved,并且每个 Promise 的返回值按照传入的 Promise 数组的顺序返回。如果其中任意一个 Promise 被 reject,则返回的 Promise 会直接 reject 并抛出错误。

该方法具有以下特点:

  • 接受多个 Promise 实例作为参数,以数组的方式传递。
  • 只有当数组中所有 Promise 实例的状态都为 resolved,结果才会按照数组的传入顺序返回成功的结果。
  • 只有一个 Promsie 实例的状态改变,该方法的返回 Promise 实例的状态就会发生改变,Promise.all 返回的 Promise 实例的状态会由第一个被 rejected 的 Promise 实例决定。

示例代码如下:

Promise.allSettled 与 Promise.all 的区别

通过上述的介绍与示例代码,我们可以得出以下结论:

  • Promise.allSettled 返回一个数组,其所有 Promise 都会执行,并且会根据个 Promise 的状态,返回一个对象包含 Promise 的状态和结果。而 Promise.all 只有在所有 Promise 都被 resolved 时才会执行,并且将所有 Promise 的返回值按照传入 Promise 数组的顺序组成一个新数组返回。
  • Promise.allSettled 不会在所有 Promise 实例都 resolve 后才执行,而 promise.all 则需要在所有 Promise 实例都为 resolve 状态时才会有返回的结果。

换句话说,Promise.allSettled 偏重于我们关注每个 Promise 实例的状态和结果,而 Promise.all 偏重于“所有 Promise 实例都应该完成”。因此,我们应该根据需求,合理选择使用以上两种方法。

总结

Promise.allSettled 与 Promise.all 在某些场景下具有相似之处,但仍然存在较大的差异。在实际开发中,要根据具体的需求和业务场景去选择使用。掌握这两种方法的使用方式和规则,对提高前端编程能力和编写高质量代码有很大的帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6518e53395b1f8cacd128549

纠错
反馈