ECMAScript 2019 中的 Promise.allSettled 快速完整处理多个异步操作?

在前端开发中,我们经常需要处理多个异步操作,例如多个接口请求返回的数据需要合并。在过去使用 Promise.all 时,一旦有一个异步操作出现异常,就会导致整个 Promise.all 的异常处理走向 reject。这样的处理方式可能并不是我们所期望的。

在 ECMAScript 2019 版本中,Promise.allSettled 被引入作为 Promise.all 的替代方案。在本文中,我们将探讨 Promise.allSettled 的特点、实现原理以及应用场景。

什么是 Promise.allSettled?

Promise.allSettled 是一个能够快速完整处理多个异步操作的方法。它返回一个 Promise 对象,该对象在所有传入的 Promise 对象都执行完毕后resolve,并以对象数组形式返回每个 Promise 对象结果的结果。

Promise.allSettled 不会因为其中一个异步操作失败而拒绝整个 Promise。即使全部异步操作都失败,Promise.allSettled 也会执行和返回结果。

Promise.allSettled 的应用场景

在实际开发中,我们经常需要从多个异步数据源中获取数据,此时使用 Promise.all 或者 Promise.race 可能会遇到问题,比如失败的数据无法处理、表现不出等待所有结果返回等需求。

Promise.allSettled 可以让我们更完整地处理异步操作的结果,无论成功还是失败,都会返回结果。这对于数据分析、数据可视化、埋点等场景非常有利。

以下是一个示例:

----- -------- - -
  --------------------- ----
  ------------------ ------------------
  --------------------- ---
--

----------------------------
  ------------- -- ----------------------
---
 - ---
 - --
 -   ------- ------------
 -   ------ ----- --
 - -- -
 -   ------- -----------
 -   ------- ----------------
 - -- -
 -   ------- ------------
 -   ------- ----- --
 - --
 --

Promise.allSettled 的实现原理

Promise.allSettled 的实现原理非常简单。它通过 Promise.all 方法获取所有 Promise 对象的结果,并且在每个 Promise 对象执行完毕后通过 Promise.resolve 和 Promise.reject 将 resolved 和 rejected 状态的 Promise 转换成统一的格式。最终返回一个 Promise 对象,包含 converted Promise 对象的结果数组。

以下是 Promise.allSettled 的简化示例:

------------------ - -------- -- ------------
  -------------- -- ------------------
    ----------- -- --------- ------------ --------
    ------------- -- --------- ----------- ---------
  -
--

结论

Promise.allSettled 的引入,让我们在处理多个异步操作时更加严谨和精确。它允许我们收集所有 Promise 对象的结果,并且不会因为某一个异步操作的失败而影响到整个操作的结果。它的实现非常简单,易于理解和维护。在实际开发中,可以根据场景选择使用 Promise.allSettled 或者其它 Promise 方法。

参考资料

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/672896752e7021665e20ca20