ECMAScript 2020 中的 Promise.allSettled 和 Promise.any 的详细使用及比较

阅读时长 5 分钟读完

ECMAScript 2020 引入了两个新的 Promise API,它们分别是 Promise.allSettled 和 Promise.any。这两个 API 缩短了需要在异步代码中处理多个 Promise 的代码量,并且提供了更好的错误处理能力。

Promise.allSettled

Promise.allSettled 方法接受一个 Promise 数组作为参数,该方法返回一个新的 Promise,这个 Promise 在所有给定的 Promise 对象都已经 fulfilled 或 rejected,也就是所有 Promise 对象都已经 settled(完成)之后才会 resolve。返回的 Promise 对象的结果是一个对象数组,每个对象包含 Promise 的状态和值。

下面是 Promise.allSettled 的基本示例:

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

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

这个示例中,我们给 Promise.allSettled 方法传递了三个 Promise 对象,其中一个是被 reject 的。当所有 Promise 对象都 settled 之后,then 方法中的代码会执行。如果其中的任何一个 Promise 被 reject,我们可以使用 catch 方法捕获这个错误。

代码输出结果如下:

可以看到,Promise.allSettled 返回了一个对象数组,数组中的每个对象都包含一个 status 和一个 value 属性。对象的 status 属性可以是 'fulfilled' 或 'rejected',value 属性则是对应 Promise 对象的值或错误信息。

Promise.any

Promise.any 方法接受一个 Promise 数组作为参数,该方法返回一个新的 Promise,这个 Promise 在数组中的任何一个 Promise 对象变为 fulfilled 状态时都会 resolve。当所有 Promise 对象都变为 rejected 状态时,Promise.any 方法会抛出一个 AggregateError 错误,这个错误包含所有错误信息的数组。

下面是 Promise.any 的基本示例:

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

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

这里我们给 Promise.any 方法传递了三个 Promise 对象,每个 Promise 对象都使用不同的延迟时间模拟异步操作。在这个示例中,Promise.any 方法会返回第一个变为 fulfilled 状态的 Promise 对象的值,也就是 'bar'。如果所有的 Promise 对象都变为 rejected,就会抛出一个 AggregateError 错误,这个错误包含每个 Promise 对象的错误信息。

代码输出结果如下:

两个 API 的比较

Promise.allSettled 和 Promise.any 都是处理多个 Promise 对象的 API,它们的区别在于处理 Promise 的方式不同。Promise.allSettled 在所有 Promise 对象都 settled 之后执行,返回一个包含所有 Promise 对象结果的数组。而 Promise.any 在数组中的任何一个 Promise 对象变为 fulfilled 状态时执行,并返回第一个 fulfilled Promise 对象的值。

另外一个区别在于错误处理方式。Promise.allSettled 会捕获每个 Promise 对象的错误信息,将其存储到每个对象中,并在 Promise.allSettled 返回的对象数组中返回所有 Promise 对象的状态和值。而 Promise.any 只会捕获第一个 fulfilled 状态的 Promise 对象的值,如果所有的 Promise 对象都变为 rejected 状态,就会抛出一个 AggregateError 错误。

在使用这两个 API 的时候,需要根据实际情况选择合适的方法。

总结

ECMAScript 2020 中引入的 Promise.allSettled 和 Promise.any API 为处理多个 Promise 对象提供了更好的选择。两个 API 分别提供了不同的处理方式,并且在错误处理方面也有所不同。我们可以根据具体的使用情况选择合适的方法来处理多个 Promise 对象。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6497faad48841e9894508213

纠错
反馈