在 ES2020 中,Promise.allSettled 被正式引入,这个 API 可以使得更容易地处理异步操作完成后的结果。本篇文章将为你介绍 Promise.allSettled 的使用方法和实例教程。
Promise.allSettled 简介
Promise.allSettled 可以接收并发所有的 Promise,返回一个新的 Promise 实例。这个新的实例在所有的子 Promise 完成后才会被 resolve。返回的结果包含了一个对象数组,其中每个对象描述了对应的子 Promise 完成状态信息。
状态信息
Promise.allSettled 返回的状态信息分为以下两种:
- fulfilled:子 Promise 成功 resolve 后的状态,包含一个 value 属性,记录 resolve 的值。
- rejected:子 Promise 失败后的状态,包含一个 reason 属性,记录失败的原因。
语法
Promise.allSettled(iterable)
参数
- iterable:一个可迭代的对象,比如数组,其中包含了一个或多个 Promise。
返回值
- 返回一个 Promise,其结果等于所有子 Promise 的状态情况,包含一个对象数组,其中每个对象描述了对应的子 Promise 完成状态信息。
实例教程
我们可以使用 Promise.allSettled 来并发执行多个异步操作,最后将所有异步操作的结果一起返回。比如,我们有三个请求需要并行加载,我们使用 Promise.allSettled 可以方便地获取到这三个请求的结果。
-- -------------------- ---- ------- ----- -------- - ----------------------------- -- ----------- ----- -------- - ----------------------------- -- ----------- ----- -------- - ----------------------------- -- ----------- ----------------------------- --------- ----------------------- -- - ----- ---- - ------------------ -- - -- -------------- --- ------------ - ------ ------------ - ---- - ------ ----- - -- ----------------- -- - ------ ------ ----- - --
这个示例中,我们定义了三个异步请求操作,使用 fetch API 去获取数据。然后使用 Promise.allSettled 将这三个 Promise 并行执行,一旦这三个请求拿到数据,它们的状态会被成功 resolve,同时我们将这三个 Promise 作为参数传入 Promise.allSettled 中。
最后我们使用 results.map 迭代所有的子 Promise 的状态信息,解析每个 Promise 是否成功,如果成功,我们就将其数据获取到,否则返回 false。
如果你要想获得所有 Promise 的结果,包括 rejected 状态的 Promise,可以修改上面例子中的代码如下:
-- -------------------- ---- ------- ----------------------------- --------- ----------------------- -- - ----- ---- - ------------------ -- - -- -------------- --- ------------ - ------ ------------ - ---- - ------ ------------- - -- ----------------- --
这里我们将 else 分支修改为返回 result.reason。如果 Promise reject,result.reason 就是 reject 的原因。
总结
在这篇文章中,我们学习了 Promise.allSettled 的基本用法和实例教程。这个 API 能够让我们更方便地处理异步操作并发的结果。现在你可以开始使用 Promise.allSettled 来优化你的代码了!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/648ba7f048841e98949f4025