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