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