ES11 Promise.all 和 Promise.allSettled 异同

阅读时长 5 分钟读完

在前端开发中,异步操作已经成为了必不可少的一部分。为了解决异步回调地狱的问题,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

纠错
反馈

纠错反馈