Promise.all() 方法中如何不因异常终止整个执行流程?

阅读时长 4 分钟读完

Promise.all() 是 JavaScript 中一个常用的异步处理方法,它接受一个由 Promise 对象组成的数组,并在所有 Promise 对象都变为 resolved 状态后返回一个新的 Promise 对象。然而,当数组中的某个 Promise 对象出现异常时,整个执行流程就会被终止,这就对于一些需要对数组中每一个元素依次处理的场景造成了困扰。

下面,我们将介绍两个通过代码演示的方法,来解决这个问题。

方法一:使用 Promise.allSettled()

在 ES2020 中,新增了一个 Promise.allSettled() 方法,它与 Promise.all() 大致相同,只不过当数组中的某个 Promise 对象出现异常时,整个执行流程不会被终止,也不会抛出异常,而是继续执行后续的 Promise 对象,直到所有 Promise 对象都处理完毕。

下面是一个使用 Promise.allSettled() 的例子:

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

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

在本例中,我们定义了一个包含三个 Promise 对象的数组。第一个和第三个 Promise 都会成功,而第二个 Promise 会失败。

在使用 Promise.allSettled() 方法处理这个数组时,我们通过一个回调函数来遍历每个 Promise 结果对象。如果该结果对象的状态为 fulfilled,则说明该 Promise 对象成功,我们可以从 value 属性中拿到其返回值;如果该结果状态为 rejected,则说明该 Promise 对象异常,我们可以通过 reason 属性拿到其原始错误对象,并从中取出错误信息。

方法二:使用 Promise.all() 和 catch 块

在 ES6 中,Promise.all() 方法并不会处理数组中某个 Promise 对象出现异常的情况,但我们可以通过 catch 块来避免整个执行流程被终止。

下面是一个使用 Promise.all() 和 catch 块的例子:

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

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

在本例中,我们定义了一个包含三个 Promise 对象的数组,但这次我们在每个 Promise 对象后面加上了 catch 块,并在这个块中返回了 undefined。这样做的目的是让每个 Promise 对象都变为 resolved 状态,即使它在原本应该出现异常的地方。

然后,我们使用 Promise.all() 方法来处理这个数组,并在该方法的回调函数中记录所有结算结果。如果数组中的所有 Promise 对象都成功,则调用 then 块,并输出结果;如果有任意一个 Promise 对象出现异常,则调用 catch 块,并在该块中输出错误信息。

总结

在使用 Promise.all() 方法处理数组时,如果需要在某个 Promise 对象出现异常时不终止整个执行流程,我们可以使用 Promise.allSettled() 方法或 Promise.all() 方法配合 catch 块来达到这个目的。这样做会增加一些额外的代码量,但能让业务逻辑更加严谨,让程序的鲁棒性更强。

以上就是 Promise.all() 方法中如何不因异常终止整个执行流程的两种解决方案。希望本文能够对你理解 Promise 的使用和错误处理提供有价值的帮助。

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

纠错
反馈