前言
在 JavaScript 中,Promise 是一种非常常见的异步编程方式。在 ES2015 中,Promise 被正式引入了标准库,成为了 JavaScript 中的一等公民。Promise 可以让我们更加方便地处理异步操作,避免了回调地狱的问题。
在 ES10 中,Promise 新增了一个方法:Promise.allSettled。这个方法可以帮助我们更好地处理一组 Promise 的状态,下面我们来详细了解一下这个方法。
Promise.allSettled 方法
Promise.allSettled 方法接收一个 Promise 数组作为参数,返回一个新的 Promise,这个 Promise 在所有 Promise 都完成后才会被 resolve,resolve 的值是一个数组,数组中的每个元素都是一个对象,表示对应的 Promise 的状态。
这个对象包含两个属性:
- status: 表示 Promise 的状态,可能的值为 "fulfilled" 或 "rejected"。
- value: 如果 Promise 的状态为 "fulfilled",则 value 表示 Promise 的返回值;如果 Promise 的状态为 "rejected",则 value 表示 Promise 的 reject 原因。
下面是一个使用 Promise.allSettled 方法的示例:
const p1 = Promise.resolve(1); const p2 = Promise.reject('error'); const p3 = Promise.resolve(3); Promise.allSettled([p1, p2, p3]) .then((results) => { console.log(results); });
输出结果为:
[ { status: 'fulfilled', value: 1 }, { status: 'rejected', value: 'error' }, { status: 'fulfilled', value: 3 } ]
可以看到,Promise.allSettled 方法返回了一个数组,数组中包含了每个 Promise 的状态和返回值。
Promise.allSettled 方法的应用场景
Promise.allSettled 方法的主要应用场景是:当我们需要等待多个异步操作都完成后,才能进行下一步操作时,我们可以使用 Promise.allSettled 方法来等待所有异步操作完成。
在之前的版本中,我们可能会使用 Promise.all 方法来实现这个功能,但是 Promise.all 方法会在任何一个 Promise 被 reject 后立即 reject,这样就会导致其他 Promise 的结果被忽略。
使用 Promise.allSettled 方法可以避免这个问题,因为它会等待所有 Promise 的状态都被 settled 后再返回结果。
下面是一个使用 Promise.allSettled 方法的示例:
-- -------------------- ---- ------- ----- ---------- - -- -- - ----- ---- - - ----------------------------------------------- ----------------------------------------------- ----------------------------------------------- -- ------ ------------------------------- -- ------------- -- ------------ --------------- -- - ----- ----- - ------- -------------- -- ------------- --- ------------ ----------- -- --------------------- ------ ------------------- -- ------------- -- - ------------------- ---
这个示例中,我们定义了一个 fetchUsers 函数,这个函数会返回一个 Promise,这个 Promise 会等待三个 fetch 请求都完成后才会 resolve。在 then 方法中,我们过滤出了所有状态为 "fulfilled" 的 Promise,然后通过 map 方法将这些 Promise 转换成 JSON 格式的数据。最后,我们又使用 Promise.all 方法等待所有 Promise 完成后再输出结果。
总结
ES10 中新增的 Promise.allSettled 方法可以帮助我们更好地处理一组 Promise 的状态,避免了在 Promise.all 方法中由于一个 Promise reject 导致其他 Promise 被忽略的问题。在实际应用中,我们可以使用 Promise.allSettled 方法来等待多个异步操作都完成后再进行下一步操作。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65c9c234add4f0e0ff396b83