在前端开发中,异步操作已经成为了必不可少的一部分。为了解决异步回调地狱的问题,ES6 中引入了 Promise。在 ES11 中,新增了 Promise.all 和 Promise.allSettled 这两个方法,分别用于处理多个 Promise 实例返回的结果。本文将详细讨论它们的异同。
Promise.all
Promise.all 接收一个包含多个 Promise 实例的数组,返回一个新的 Promise 实例,等待所有的 Promise 都完成后,才会返回一个包含所有实例结果的数组。如果其中一个失败,那么整个 Promise.all 就会返回一个 rejected 状态。
下面是一个例子,三个 Promise 实例都成功了,那么 Promise.all 就返回一个包含它们结果的数组:
-- -------------------- ---- ------- ----- -------- - - ----------------------- ----------------------- ---------------------- -- --------------------- ------------- -- --------------------- -- ------- ------ ------ ------------ -- ----------------------展开代码
如果其中有一个 Promise 实例被 rejected,那么 Promise.all 就会立即返回一个 rejected 状态的 Promise:
-- -------------------- ---- ------- ----- -------- - - ----------------------- --------------------------- ---------------------- -- --------------------- ------------- -- --------------------- ------------ -- ---------------------- -- --------展开代码
Promise.allSettled
在 Promise.all 不能处理其中一个 Promise 失败的情况下,Promise.allSettled 就不一样了。Promise.allSettled 接收一个包含多个 Promise 实例的数组,返回一个新的 Promise 实例,等待所有的 Promise 都返回结果后,返回一个包含所有实例结果的数组。这里不论 Promise 成功或失败,都将被处理并返回结果。返回结果中每一项都包含 Promise 执行完成的状态(fulfilled or rejected)和值或原因。
下面是一个例子,其中一个 Promise 实例被 rejected,Promise.allSettled 也会返回该 Promise 的结果和状态:
-- -------------------- ---- ------- ----- -------- - - ----------------------- --------------------------- ---------------------- -- ---------------------------- ------------- -- --------------------- ------------ -- ---------------------- -- -- ------- ------------ ------ ----- -- - ------- ----------- ------- ---------- -- - ------- ------------ ------ ----- --展开代码
异同比较
Promise.all 和 Promise.allSettled 之间的区别主要在于对于其中一个 Promise 实例失败的处理情况。
- Promise.all 在遇到任何一个 Promise 实例 reject 时,就会直接 reject 并停止运行。
- Promise.allSettled 会等待所有 Promise 实例都完成,并返回所有 Promise 实例的状态和结果,包括 rejected 的实例。
因此,当我们需要处理每个 Promise 实例的状态和结果时,就可以选择使用 Promise.allSettled。
指导意义
掌握 Promise.all 和 Promise.allSettled 的使用,有助于优化我们代码中的异步处理流程,提高代码的可读性和可维护性。使用 Promise.all 可以将多个 Promise 的调用结果合并到一个 Promise 中统一处理,而 Promise.allSettled 则可以帮助我们获取所有 Promise 实例的状态和值。在实际开发中,我们应该根据实际的需求进行选择。
结论
本文介绍了 Promise.all 和 Promise.allSettled 的异同及其使用场景。Promise.all 和 Promise.allSettled 两者之间的选择应该根据实际应用场景来确定。而对于异步数据的流处理,在实际应用中我们也可以考虑通过 async/await 进行优化。
参考资料
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/673413ac0bc820c582465a24