ES2020 中的新特性:Promise.allSettled(), Promise.any()

众所周知,JavaScript 中的 Promise 是一种非常强大的异步编程解决方案。而在 ES2020 中加入了两个新的 Promise 方法:Promise.allSettled() 和 Promise.any()。这两个方法的作用分别是:

  1. Promise.allSettled(): 接收一个 Promise 数组,返回一个 Promise 实例。当数组中所有 Promise 都变为 settled 状态(即 fulfilled 或 rejected)时,该实例才会变为 settled 状态,返回的结果是一个数组,该数组包含所有 Promise 的结果(无论成功或失败)。具体而言,当数组中所有 Promise 都变为 settled 状态时,Promise.allSettled() 返回的 Promise 实例变为 fulfilled 状态,返回值为一个数组,包含着每个 Promise 对象的状态(fulfilled 或 rejected)以及其结果。
  2. Promise.any(): 接收一个 Promise 数组,返回一个 Promise 实例。当数组中有任意一个 Promise 成功(即 fulfilled)时,该实例就会变为 fulfilled 状态并返回该 Promise 的结果。如果数组中所有 Promise 都失败(即 rejected),该实例就会变为 rejected 状态并返回 AggregateError,其中包含了所有的失败原因。

下面我们将更详细的介绍这两个方法,并给出一些实例应用。

Promise.allSettled()

在我们使用 Promise.all() 时,只有当数组中所有的 Promise 对象都变为 fulfilled 状态时,Promise.all() 才会返回一个以每个 Promise 对象值组成的数组,但如果数组中有任意一个 Promise 对象状态为 rejected 状态时,Promise.all() 就会返回这个失败的 Promise 对象,此时其它的 Promise 对象将被忽略。

而通过使用 Promise.allSettled() ,我们可以更轻松地处理这种情况,无论 Promise 是否变为 fulfilled 状态,我们都可以通过返回的数组中的信息知道每个 Promise 对象是处于什么状态下的。

让我们看一个示例:

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

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

根据上面代码,我们会返回一个由以下对象组成的数组:

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

我们可以在每个对象中获取 status 属性(fulfilled 或 rejected)以及其它有关 Promise 对象的信息,如此更灵活地处理多个 Promise 对象。

Promise.any()

Promise.any() 是一个非常方便的特性,在我们关心任意一个 Promise 对象成功的结果(刨除失败结果)时,如果我们使用 Promise.all() 是不太合适的。这时我们可以使用 Promise.any() 方法取代 Promise.all(),它会返回该数组中首个成功 Promise 的值。

看一个例子:

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

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

取决于 Promise 执行的时间轴或 Promise 执行函数本身,我们可能会看到 “3” 或 ValueError: All Promises rejected. 的错误提示。

需要注意的是,这个方法是新加入的,且对许多浏览器版本尚不支持,所以在使用时需要小心谨慎,最好对于 Promise.any() 的兼容性进行验证。

结论

Promise.allSettled() 和 Promise.any() 都是 ES2020 中非常有用的 Promise 解决方案。通过实现这些方法并使用它们,我们可以更好地编写更健壮的异步应用程序。此外,这些新特性也提供了更多的灵活性和处理异常的方法,可以使我们更轻松地编写更出色的 JavaScript 代码。

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