Promise.allSettled:它与 Promise.all 有何不同?

阅读时长 4 分钟读完

在前端开发中,Promise 是非常常见的异步编程方法。其中,Promise.all() 是用来处理多个 Promise 实例的方法,它可以将多个 Promise 实例包装成一个新的 Promise 实例,只有在所有 Promise 都执行成功时才会返回成功状态,否则返回失败状态。但是,这个方法有一个问题,如果其中一个 Promise 实例失败了,整个 Promise.all() 就会失败,而不管其他 Promise 实例是否成功。

为了解决这个问题,ES2020 引入了 Promise.allSettled() 方法,它能够处理多个 Promise 实例,无论是否成功都会返回一个状态为已解决的 Promise 实例。

Promise.allSettled 的用法

Promise.allSettled() 的用法和 Promise.all() 类似,只是返回的 Promise 实例状态不同。它接收一个 Promise 实例数组作为参数,返回一个新的 Promise 实例。

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

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

上面的代码中,我们传递了一个 Promise 实例数组,然后使用 Promise.allSettled() 方法将它们包装起来。在返回的 Promise 实例解决后,我们使用 forEach() 方法遍历结果数组,并输出每个 Promise 实例的状态和值。

Promise.allSettled 的返回值

Promise.allSettled() 返回的是一个包含每个 Promise 实例结果的数组,每个结果都是一个对象,包含以下属性:

  • status:表示 Promise 实例的状态,可能的值为 "fulfilled" 或 "rejected"。
  • value:表示 Promise 实例的结果值,如果状态为 "fulfilled",则为返回值,如果状态为 "rejected",则为错误对象。

Promise.allSettled 与 Promise.all 的不同

Promise.all() 和 Promise.allSettled() 的最大不同在于状态处理上。如果其中一个 Promise 实例被拒绝,Promise.all() 就会立即返回一个拒绝状态的 Promise 实例,而 Promise.allSettled() 则会等待所有 Promise 实例都执行完毕后返回一个状态为已解决的 Promise 实例,并在结果数组中包含所有 Promise 实例的状态和值。

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

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

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

上面的代码中,我们传递了一个包含一个被拒绝的 Promise 和一个被解决的 Promise 的数组。在 Promise.all() 中,因为有一个 Promise 被拒绝了,它就会立即返回一个拒绝状态的 Promise 实例,并输出错误信息。但是在 Promise.allSettled() 中,它会等到所有 Promise 实例都执行完毕后返回一个状态为已解决的 Promise 实例,并输出所有 Promise 实例的状态和值。

总结

Promise.allSettled() 是一个非常有用的方法,它可以处理多个 Promise 实例,无论结果是成功还是失败,都会返回一个状态为已解决的 Promise 实例。它可以帮助我们更好地处理异步操作的结果,避免因为其中一个 Promise 实例失败而导致整个异步操作失败。在实际开发中,我们应该根据具体的业务需求来选择使用 Promise.all() 还是 Promise.allSettled()。

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

纠错
反馈