在 ECMAScript 2020 中,Promise.allSettled() 是一种新的 Promise API,它为我们提供了一种更全面和灵活的处理 Promise 的方法。在本文中,我们将详细讲解 Promise.allSettled() 的正确使用方法,包括语法、用法和示例代码。
语法
Promise.allSettled() 的语法如下:
Promise.allSettled(iterable)
其中,iterable
是 Promise 实例的可迭代对象,可以是数组或类数组对象。该方法返回一个 Promise 实例,该 Promise 实例会在 iterable 中的所有 Promise 全部 settled 后 resolve,返回一个由所有 Promise settle 结果组成的数组,数组中每个元素都是一个对象,它们各自表示 iterable 中的 Promise settle 结果。对象包含两个属性,分别为:
status
:Promise 的状态,可以是"fulfilled"
或"rejected"
。value
或reason
:当 Promise 状态改变时所带的resolve
或reject
函数的参数。
用法
假设有两个 Promise,会分别返回以下结果:
const p1 = new Promise(resolve => resolve("p1 resolved")); const p2 = new Promise((resolve, reject) => reject(new Error("p2 rejected")));
我们可以使用 Promise.allSettled() 以如下方式:
Promise.allSettled([p1, p2]).then(results => console.log(results));
这将打印出以下结果:
[ { status: "fulfilled", value: "p1 resolved" }, { status: "rejected", reason: Error: p2 rejected at <anonymous>:1:59 } ]
从结果看来,我们可以清晰地看到两个 Promise 的 settle 结果和 reject 原因。
需要注意的是,即使同步代码中发生任何错误,Promise.allSettled()返回的数组仍将被 resolve,并且每个已 settled 的 Promise 的数据将被包含在结果数组中。比如:
const p3 = new Promise(resolve => resolve("p3 resolved")); const p4 = new Promise(() => { throw new Error("p4 thrown an error") }); Promise.allSettled([p3, p4]).then(results => console.log(results));
这将打印出以下结果:
[ { status: "fulfilled", value: "p3 resolved" }, { status: "rejected", reason: Error: p4 thrown an error at <anonymous>:2:21 } ]
合理应用
Promise.allSettled() 的一个最大优点是它可以处理在一个项目中可能产生的多个请求。在使用该方法时,我们可以将需要进行处理的请求以 Promise 数组的形式放入到方法中,并对所有请求的结果进行集中处理和管理。
下面,我们举一个结合 axios 发出请求的实际的例子:
-- -------------------- ---- ------- ------ ----- ---- -------- ----- ---- - -------------------------------- -------------------------------- ----- ------------ - ------------ -- ---------------- -------------------------------- ------------- -- ---------------------- -- - -- -------------- --- ------------ - ------------------------------- - ---- - --------------------------- - ----
在这个例子中,我们使用 axios.get() 方法发出两个 API 服务的请求。我们使用 Promise.allSettled() 将两个请求相应的 Promise 组成一个数组,最后处理返回的结果,并在控制台上打印数据或错误信息。
总结
使用 Promise.allSettled() 可以更加灵活和精细地处理多个 Promise 实例的 settle 结果。在实际开发过程中,我们经常会使用该方法,对接口请求结果进行集中处理和管理。了解 Promise.allSettled() 的正确使用方法对开发者来说是非常重要的,它更加符合复杂项目的需求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e5cc72f6b2d6eab3145d96