Promise.allSettled 是 ES2020 中新增的 Promise 方法之一,它可以并行执行多个 Promise 实例,并在所有 Promise 实例都 settled(fulfilled 或 rejected)后返回一个数组,数组中包含每个 Promise 实例的状态和结果。
Promise.allSettled 的使用
Promise.allSettled 的语法如下:
Promise.allSettled(iterable)
其中,iterable 是一个可迭代对象,例如数组或类数组对象。Promise.allSettled 返回一个 Promise 实例,当 iterable 中所有 Promise 实例都 settled 后,它将被 fulfilled,返回的结果是一个数组,数组中包含每个 Promise 实例的状态和结果。
下面是一个使用 Promise.allSettled 的例子:
const promises = [ Promise.resolve(1), Promise.reject(new Error('fail')), Promise.resolve('success') ]; Promise.allSettled(promises) .then(results => console.log(results));
上面的代码中,promises 数组包含三个 Promise 实例,其中两个是 resolved,一个是 rejected。Promise.allSettled 返回的结果是一个数组,数组的长度等于 promises 数组的长度,每个元素是一个对象,对象包含两个属性:status 和 value 或 reason。status 的值为字符串 fulfilled 或 rejected,value 或 reason 分别表示 Promise 实例 settled 后的值或原因。
输出的结果如下:
[ { status: 'fulfilled', value: 1 }, { status: 'rejected', reason: Error: fail }, { status: 'fulfilled', value: 'success' } ]
Promise.allSettled 的优化
在 ES10 中,Promise.allSettled 的返回值可以通过 Object.fromEntries 方法转换为以 Promise 实例索引为键,状态和结果为值的对象。Object.fromEntries 是 ES2019 中新增的方法,它可以将一个二维数组转换为一个对象。
下面是一个使用 Object.fromEntries 的例子:
-- -------------------- ---- ------- ----- -------- - - ------------------- ------------------ --------------- -------------------------- -- ---------------------------- ------------- -- ------------------- -------------------- ------ -- ------- - ------- -------------- ------ ------------- --- ----------- - ------------ - ------------- --- -- --------- -- ------------------
上面的代码中,使用了 results.map 方法将 results 数组转换为一个二维数组,二维数组中每个元素是一个包含 Promise 实例索引、状态和结果的数组。然后使用 Object.fromEntries 方法将二维数组转换为一个对象,对象的键是 Promise 实例索引,值是一个包含状态和结果的对象。
输出的结果如下:
{ 0: { status: 'fulfilled', value: 1 }, 1: { status: 'rejected', value: Error: fail }, 2: { status: 'fulfilled', value: 'success' } }
使用 Object.fromEntries 可以使 Promise.allSettled 返回的结果更易于处理和访问。
总结
Promise.allSettled 是一个非常实用的 Promise 方法,它可以并行执行多个 Promise 实例,并在所有 Promise 实例都 settled 后返回一个数组,数组中包含每个 Promise 实例的状态和结果。在 ES10 中,Promise.allSettled 的返回值可以通过 Object.fromEntries 方法转换为以 Promise 实例索引为键,状态和结果为值的对象,这使得 Promise.allSettled 的返回值更易于处理和访问。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65f44d2e2b3ccec22fca8af1