解决 Promise.all() 中抛出的异常

在前端开发过程中,我们经常需要并行处理多个异步任务,而 Promise.all() 方法正好能够满足这个需求。Promise.all() 方法接收一个 Promise 对象的数组,并返回一个新的 Promise 对象,该 Promise 对象在数组中所有 Promise 对象都成功时才会成功,否则会返回一个失败的 Promise 对象。

然而,在处理多个异步任务时,有时候会出现其中一个任务失败的情况。这时候,Promise.all() 方法会抛出异常并终止所有任务的执行。这对于我们的应用来说是不可接受的,因为我们需要保证所有任务都能够被执行完毕。

那么,该如何解决 Promise.all() 中抛出的异常呢?下面,我们将介绍两种解决方案。

方案一:使用 Promise.allSettled()

Promise.allSettled() 方法接收一个 Promise 对象的数组,并返回一个新的 Promise 对象,该 Promise 对象在数组中所有 Promise 对象都完成时才会完成。与 Promise.all() 方法不同的是,即使其中一个 Promise 对象失败,Promise.allSettled() 方法也会继续执行所有任务,并返回一个包含所有 Promise 对象状态的数组。

例如,我们有三个异步任务需要处理,它们分别是:

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

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

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

我们可以使用 Promise.allSettled() 方法来处理这三个任务:

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

输出结果为:

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

方案二:使用 try...catch

另一种解决方案是使用 try...catch 语句捕获 Promise 对象的异常。我们可以在每个 Promise 对象中使用 try...catch 语句来捕获异常,并将异常信息保存到一个数组中。在所有任务完成后,我们可以通过判断异常数组的长度来确定是否有任务失败。

例如,我们有三个异步任务需要处理,它们分别是:

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

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

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

我们可以使用 try...catch 语句来处理这三个任务:

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

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

输出结果为:

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

总结

在处理多个异步任务时,我们经常需要使用 Promise.all() 方法来并行执行任务。然而,当其中一个任务失败时,Promise.all() 方法会抛出异常并终止所有任务的执行。为了解决这个问题,我们可以使用 Promise.allSettled() 方法或者使用 try...catch 语句捕获 Promise 对象的异常。这样,即使其中一个任务失败,我们也可以保证所有任务都能够被执行完毕。

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