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