Promise.allSettled 替代 Promise.all:从 Promise.all() 的坑中脱出来

Promise.allSettled 替代 Promise.all:从 Promise.all() 的坑中脱出来

当我们使用 Promise.all() 来同时执行多个异步操作时,如果有任意一个操作出现错误,整个 Promise 都会 reject,这样就无法得到其余操作的返回值。针对这个问题,ES2020 推出了 Promise.allSettled() 方法,该方法不会因为某些 Promise 的 reject 而直接中止,而是会等待所有 Promise 结束后返回统一的结果,同时记录所有 Promise 的状态以及每个 Promise 的值或原因。

Promise.all() 与 Promise.allSettled() 的区别

假设我们有如下三个 Promise 对象:

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

如果使用 Promise.all() 来同时执行这三个 Promise 对象,并将其返回值保存到变量 results 中:

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

结果会是:

----------

可以看到,因为 promise2 出现错误,整个 Promise 也会 reject,导致 results 中只包含了 promise1 的返回值,并且无法获得 promise3 的返回值。

而使用 Promise.allSettled():

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

则会得到以下结果:

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

可以看到,Promise.allSettled() 会等待所有 Promise 执行完毕后返回结果,并记录每个 Promise 的状态以及其返回值或错误原因。

如何使用 Promise.allSettled()?

Promise.allSettled() 的用法与 Promise.all() 相同:

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

需要注意的是,在处理 results 时,我们需要根据每个 Promise 的状态来判断其是否成功,并在处理 Promise 返回值时,也需要注意处理 Promise.reject() 的情况。

示例代码:

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

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

输出结果:

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

在这个例子中,我们使用了 filter() 和 map() 方法来处理返回的结果,从中筛选出成功的结果。

结论

Promise.allSettled() 是一个强大的异步操作处理方法,它可以让我们更好地处理异步操作的返回结果,避免由于单个 Promise 的 reject 而导致整个操作的失败。但是,我们在使用时也需要注意对结果的处理,以及 Promise 返回值在 reject 状态下的处理。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/670cf2fd5f551281025c14d9