在 ECMAScript 2020 中,新增加了 Promise allSettled(Promise.allSettled) API,它是 Promise.all 的一个改进版本。Promise.all 只有当所有 Promise 对象都被解析时才返回结果,这意味着如果其中一个 Promise 对象被拒绝,结果将被拒绝并返回错误信息。但是,Promise allSettled 在所有 Promise 对象都被解析或拒绝后才返回结果,这样可以让我们更好地处理 Promise 对象的状态。
在本文中,我们将介绍 Promise allSettled 的基本用法,以及一个实际的应用案例来展示它的优势。希望读者通过本文的学习,可以更好地理解如何利用 Promise allSettled 解决一些常见的问题。
基本用法
Promise allSettled 和 Promise.all 方法非常相似,都是将多个 Promise 对象组合为一个 Promise 对象,只是在处理 Promise 对象状态的方式上有些不同。Promise.all 在所有 Promise 对象都被解析时返回解析结果,如果其中一个 Promise 对象被拒绝,则返回拒绝信息。而 Promise allSettled 在所有 Promise 对象都被解析或拒绝后才返回结果。
Promise allSettled 的基本语法如下:
Promise.allSettled(iterable);
其中,iterable
是一个可迭代的对象,例如数组或 Set。
Promise allSettled 返回一个 Promise 对象,当所有 Promise 对象都被解析或拒绝时,该 Promise 对象的状态才会被解析或拒绝。其解析值是一个数组,数组中的每个元素对应着 iterable 中的每个 Promise 对象的状态。对于被解析的 Promise 对象,其状态对象包含一个 status
属性和一个 value
属性,而对于被拒绝的 Promise 对象,其状态对象包含一个 status
属性和一个 reason
属性。
下面是 Promise allSettled 的一个简单示例:
const promises = [ Promise.resolve('resolved promise'), Promise.reject('rejected promise') ]; Promise.allSettled(promises) .then(results => results.forEach(result => console.log(result.status, result.value || result.reason)));
输出结果如下:
fulfilled resolved promise rejected rejected promise
应用案例
下面我们来看一个实际的应用案例,假设我们要从一组服务器上获取数据,如果其中一个服务器出现故障或者无法连接,我们希望能够忽略该服务器,并将其他服务器返回的数据整合成一个数组。我们可以使用 Promise allSettled 来实现这个功能。
首先,我们需要定义一个用于获取服务器数据的方法,并使用 Promise 包装它:
-- -------------------- ---- ------- -------- ---------------------- - ------ --- ----------------- ------- -- - ----- --- - --- ----------------- ---------------------- - ---------- - -- --------------- --- -- - -- ----------- -- --- -- ---------- - ---- - -------------------------- - ---- - ----------------------- - - -- --------------- ---- ------ ----------- --- -
接下来,我们定义一个包含多个服务器地址的数组,然后使用 map
方法将每个服务器地址映射成一个 Promise 对象,并使用 Promise allSettled 来等待所有 Promise 对象都被解析或拒绝:
-- -------------------- ---- ------- ----- ---------- - - ---------------------------------- ---------------------------------- ---------------------------------- ---------------------------------- --------------------------------- -- ----------------------------------------------------- ------------- -- - ----- -------- - --------------------- -- ------------- --- ----------------------- -- -------------- ---------------------- ---
在上面的示例中,我们首先使用 map
方法将服务器地址映射成 Promise 对象,并将返回的 Promise 对象数组传递给 Promise allSettled。然后,在 Promise allSettled 的回调函数中,我们过滤出所有被解析的 Promise 对象,并将它们的解析值存入一个数组中。
结论
在本文中,我们介绍了 Promise allSettled 的基本用法,并使用一个实际的应用案例来展示它的优势。使用 Promise allSettled 可以让我们更好地处理多个 Promise 对象的状态,特别是当我们需要忽略部分状态时更是如此。希望读者通过本文的学习,可以更好地应用 Promise allSettled 来解决一些常见的问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67395580317fbffedf1644dd