详解 ECMAScript 2020 的 Promise.any() 和 Promise.allSettled() 方法

在 ECMAScript 2020(简称 ES2020)中,Promise 类型新增了两个方法,分别是 Promise.any() 和 Promise.allSettled()。这两个方法不仅可以简化代码编写,还能够提高代码的执行效率。本文将详细介绍这两个方法的用法及其深度应用。

Promise.any()

Promise.any() 方法用于接受一个 Promise 实例数组,如果其中有任意一个 Promise 实例状态变为 resolved,就将该 Promise 实例的结果作为 Promise.any() 方法返回的 Promise 实例的值。如果数组中所有 Promise 实例的状态都变为 rejected,则 Promise.any() 方法返回的 Promise 实例也会变为 rejected。

以下是 Promise.any() 方法的语法:

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

其中,iterable 是一个 Promise 实例数组。

让我们看一个具体的示例:

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

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

上述代码中,Promise.any() 方法接受一个 Promise 实例数组 promises,其中第二个 Promise 实例是 rejected 状态。由于数组中有一个 Promise 实例的状态变为 resolved,所以 Promise.any() 方法返回的 Promise 实例的值为 1。

如果将数组中的第一个和第二个 Promise 实例的顺序互换,那么 Promise.any() 方法就会返回一个 AggregateError 对象。AggregateError 对象是一个新的错误类型,它表示多个错误的集合。在本例中,如果数组中没有 resolved 的 Promise 实例,那么会抛出一个 AggregateError 错误。

Promise.allSettled()

Promise.allSettled() 方法用于接受一个 Promise 实例数组,它返回一个 Promise 实例,只有在数组中的所有 Promise 实例都被 settled(即状态变为 resolved 或者 rejected),该 Promise 实例才被 settled。返回的 Promise 实例的值是一个数组,数组中每个元素对应一个被 settled 的 Promise 实例的结果或原因。

以下是 Promise.allSettled() 方法的语法:

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

其中,iterable 是一个 Promise 实例数组。

让我们看一个具体的示例:

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

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

上述代码中,Promise.allSettled() 方法接受一个 Promise 实例的数组 promises。返回的 Promise 实例的值是一个数组,该数组中的每个元素是一个对象,包含了被 settled 的 Promise 实例的状态 status 和结果 value 或原因 reason。

在上述示例中,数组中的第二个 Promise 实例是 rejected 状态,但由于 Promise.allSettled() 方法会等待所有 Promise 实例被 settled,所以返回的数组中仍然包含了该 Promise 实例的结果。

深度应用

除了简化代码编写和提高执行效率以外,Promise.any() 和 Promise.allSettled() 方法还能够深度应用于实际开发中。

Promise.any() 的深度应用

Promise.any() 方法可以在前指定一个时间间隔内,抓取多个接口返回的数据,并返回最快的数据结果。这种场景在很多实时性比较高的系统中非常实用。

让我们看一个具体的示例:

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

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

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

在上述示例中,fetchData() 方法接受两个参数,分别是一个 URL 数组和一个时间间隔 timeout。fetchData() 方法会遍历 URL 数组,并将每个 URL 转化为一个 Promise 实例。然后,fetchData() 方法使用 Promise.race() 方法将每个 Promise 实例与 sleep(timeout) 的 Promise 实例进行比较,如果一个 Promise 实例无法在指定的时间间隔内返回数据,就会被 sleep(timeout) 的 Promise 实例替代。最后,fetchData() 方法返回 Promise.any() 方法返回的结果,并将其解析成 JSON 格式。

Promise.allSettled() 的深度应用

Promise.allSettled() 方法不会因为某个 Promise 实例被 rejected 而中断整个程序运行,因此可以用于实现错误监控,记录错误信息以及提供错误处理方案。

让我们看一个具体的示例:

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

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

在上述示例中,Promise.allSettled() 方法接受一个 Promise 实例数组。然后,它遍历数组中的每个 Promise 实例,并检查其状态。如果状态为 fulfilled,则将其结果 value 记录下来。如果状态为 rejected,则将其原因 reason 记录下来。最后,程序可以根据记录的信息,提供适当的错误处理方案。

结论

在本文中,我们详细介绍了 ECMAScript 2020 的 Promise.any() 和 Promise.allSettled() 方法,包括其语法、用法及其深度应用。Promise.any() 方法用于返回任意一个 Promise 实例的结果,而 Promise.allSettled() 方法用于返回所有 Promise 实例的结果或原因。这两个方法不仅可以优化代码,还可以提高程序的执行效率,同时还能够被深度应用于实际开发中。

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