ES12 中的 `Promise.allSettled` 方法:更好地处理多 Promise 情况

阅读时长 5 分钟读完

ES12 中的 Promise.allSettled 方法:更好地处理多 Promise 情况

在异步编程中,我们经常需要处理多个 Promise 对象,例如在并发请求中对多个 Promise 进行等待和处理。在之前的 Promise 标准中,我们只有 Promise.all 和 Promise.race 两种方法来处理多个 Promise 对象,而 Promise.all 只有在所有 Promise 都成功时才可执行下一步操作,而 Promise.race 则只要有一个 Promise 成功就可进行下一步操作。但这两个方法都无法处理 Promise 中的错误情况,也就是说当 Promise 中存在失败情况时,Promise.all 和 Promise.race 都无法处理,而只能抛出异常。

针对这个问题,ES12 新增加了 Promise.allSettled 方法,该方法可以处理多个 Promise 对象,成功与失败均可,且不会因为 Promise 失败而抛出异常。

使用 Promise.allSettled 方法

Promise.allSettled 接收一个 Promise 对象数组作为参数,返回一个 Promise 对象,当所有 Promise 对象 settled(即状态变为 fulfilled 或 rejected)时,返回一个包含所有 Promise 对象状态的数组。数组中每个元素是一个对象,分别包含 Promise 的状态和返回结果。

下面我们写一个示例代码来实现 Promise.allSettled 的基本用法:

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

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

可以看到,我们创建了三个 Promise 对象,其中 promise2 是一个失败的 Promise,然后执行 Promise.allSettled 方法。当所有 Promise 对象 settled 后,Promise.allSettled 返回一个包含所有 Promise 状态的数组,数组中每个元素是一个对象,包含状态和返回值(或错误信息)。

与 Promise.all 的区别

Promise.all 只有当所有的 Promise 对象都成功时,才可以执行下一步操作,一旦其中一个 Promise 失败,就会抛出异常,导致后面的操作无法完成。

Promise.allSettled 能够更好地处理多个 Promise 对象的情况,无论其中任何一个 Promise 对象失败,都不会影响最终的返回结果。而且在处理多个异步操作时,往往需要知道所有的操作结果,即使其中某个操作失败了,我们也要知道失败的原因,并进行相应的处理。

下面我们写一个实例代码,实现了多个异步请求并处理的场景:

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

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

在这个例子中,我们模拟了多个并发请求场景,其中最后一个请求 deliberately 给出了假 URL("https://jsonplaceholder.typicode.com/todos/fail"),即失败的请求。在 Promise.allSettled 方法中,我们使用了 fetch 方法来处理异步请求,并使用 Promise.allSettled 方法等待所有请求都 settled。

当所有请求 settled 后,Promise.allSettled 返回结果,我们遍历结果,根据状态输出不同信息。实际应用中,我们可以进一步根据成功与失败的请求分别处理,从而得到我们所需要的信息。

总结

Promise.allSettled 方法为我们处理多个 Promise 对象提供了更好的解决方案,能够处理多个 Promise 中的所有成功与失败情况,并返回一个所有 Promise 的状态和结果的数组。在实际开发中,使用 Promise.allSettled 方法可以更好地处理异步操作,让我们的代码更加健壮和优雅。

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

纠错
反馈