Promise.allSettled 替代 Promise.all:从 Promise.all() 的坑中脱出来
当我们使用 Promise.all() 来同时执行多个异步操作时,如果有任意一个操作出现错误,整个 Promise 都会 reject,这样就无法得到其余操作的返回值。针对这个问题,ES2020 推出了 Promise.allSettled() 方法,该方法不会因为某些 Promise 的 reject 而直接中止,而是会等待所有 Promise 结束后返回统一的结果,同时记录所有 Promise 的状态以及每个 Promise 的值或原因。
Promise.all() 与 Promise.allSettled() 的区别
假设我们有如下三个 Promise 对象:
const promise1 = Promise.resolve('成功'); const promise2 = Promise.reject('错误'); const promise3 = Promise.resolve('也成功');
如果使用 Promise.all() 来同时执行这三个 Promise 对象,并将其返回值保存到变量 results 中:
Promise.all([promise1, promise2, promise3]) .then(results => console.log(results)) .catch(error => console.log(`出现了一个错误:${error}`));
结果会是:
出现了一个错误:错误
可以看到,因为 promise2 出现错误,整个 Promise 也会 reject,导致 results 中只包含了 promise1 的返回值,并且无法获得 promise3 的返回值。
而使用 Promise.allSettled():
Promise.allSettled([promise1, promise2, promise3]) .then(results => console.log(results));
则会得到以下结果:
[ {status: "fulfilled", value: "成功"}, {status: "rejected", reason: "错误"}, {status: "fulfilled", value: "也成功"} ]
可以看到,Promise.allSettled() 会等待所有 Promise 执行完毕后返回结果,并记录每个 Promise 的状态以及其返回值或错误原因。
如何使用 Promise.allSettled()?
Promise.allSettled() 的用法与 Promise.all() 相同:
Promise.allSettled([promise1, promise2, promise3]) .then(results => { // 对结果进行处理 }) .catch(error => { // 处理错误 });
需要注意的是,在处理 results 时,我们需要根据每个 Promise 的状态来判断其是否成功,并在处理 Promise 返回值时,也需要注意处理 Promise.reject() 的情况。
示例代码:
-- -------------------- ---- ------- ----- -------- - ---------------------- ----- -------- - --------------------- ----- -------- - --- ----------------- ------- -- - ------------- -- - --------------- -- ------ --- ----------------------------- --------- ---------- ------------- -- - --------------------- ----- ----------------- - --------------------- -- ------------- --- ----------------------- -- -------------- ------------------------------------------ -- ------------ -- ---------------------------------
输出结果:
[ {status: "fulfilled", value: "成功"}, {status: "rejected", reason: "错误"}, {status: "pending"} ] 成功的结果:成功,也成功
在这个例子中,我们使用了 filter() 和 map() 方法来处理返回的结果,从中筛选出成功的结果。
结论
Promise.allSettled() 是一个强大的异步操作处理方法,它可以让我们更好地处理异步操作的返回结果,避免由于单个 Promise 的 reject 而导致整个操作的失败。但是,我们在使用时也需要注意对结果的处理,以及 Promise 返回值在 reject 状态下的处理。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670cf2fd5f551281025c14d9