在前端开发过程中,处理异步并发请求是非常常见的需求。 Promise.all()
方法可以让我们在所有 Promise 实例都 fulfilled 之后才执行某个处理逻辑,但是如果其中有一个 Promise 实例 rejected,就会中断整个并发请求,并且无法获取到其他 Promise 实例的状态。
这时候,ES12 中新增的 Promise.allSettled()
方法就能够派上用场了。
Promise.allSettled()
方法的介绍
Promise.allSettled()
方法在所有 Promise 实例都 fulfill 或 reject 后返回一个由对象组成的数组,每个对象包含一个表示对应 Promise 实例状态的 status
属性和一个表示对应 Promise 实例返回值或错误信息的 value
属性。
status
是一个字符串,可能的取值有:
fulfilled
:表示该 Promise 实例被 fulfilled 执行rejected
:表示该 Promise 实例被 rejected 执行
示例代码如下:
Promise.allSettled([promise1, promise2, promise3]) .then(results => { results.forEach(result => { console.log(result.status); // 'fulfilled' 或 'rejected' console.log(result.value); // 对应 Promise 实例返回值或错误信息 }) })
Promise.allSettled()
方法的使用场景
下面通过一个具体的示例演示 Promise.allSettled()
方法的使用场景。
我们有一个需要进行多次请求并处理最终结果的需求:
- 从 API 接口 A 中获取数据,然后处理
- 从 API 接口 B 中获取数据,然后处理
- 合并处理后的结果
如果是通过 Promise.all()
方法来处理这个需求,当 API 接口 A 或 B 中有一个请求失败时,整个并发请求就会结束。这样,在失败的情况下,我们可能不得不重试整个流程。
如果是通过 Promise.allSettled()
方法来处理这个需求,当 API 接口 A 或 B 中有一个请求失败时,我们仍然可以处理另一个请求成功的情况,而无需重试整个流程。
示例代码如下:
-- -------------------- ---- ------- ----- --------- - ----------------------------------------------- ----- --------- - ----------------------------------------------- ----- -------- - ------------------------- -- ------------ ----- -------- - ------------------------- -- ------------ ----------------------------- ----------------------- -- - ----- ------ - --------------------- -- ------------- --- ----------------------- -- -------------- -- -------------- --- -- - ----- ------- ------ - ------- --------------------------- -- ---------------- - ---- - ---------------------- - ---
总结
Promise.allSettled()
方法的出现使得我们在处理异步并发请求时变得更加的灵活和方便。在处理并发请求时,我们可以通过使用 Promise.allSettled()
方法来处理可能出现失败情况的情况,减少对整个请求流程的影响。同时,我们也可以根据返回的结果数组,更加方便地对请求结果进行筛选和处理。
但需要注意的是,Promise.allSettled()
方法需要注意性能问题。由于 Promise.allSettled()
不会中断并发请求,如果请求的数量过多,可能会导致资源的过度占用,影响应用的性能。因此,在使用 Promise.allSettled()
方法时,需要合理调整请求的数量,以避免过度占用资源的情况。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645af6a4968c7c53b0d52802