在 JavaScript 的 Promise 中,我们经常使用 Promise.all() 来等待多个 Promise 对象完成后再进行下一步操作。但是,如果其中一个 Promise 对象出现了错误,整个 Promise.all() 就会被拒绝。ES9 中,新增了 Promise.allSettled() 方法,可以在所有 Promise 对象都完成后返回一个包含每个 Promise 状态的数组,无论 Promise 对象是否成功。
Promise.all() 的问题
在使用 Promise.all() 时,如果其中一个 Promise 对象出现了错误,整个 Promise.all() 就会被拒绝,导致后续代码无法执行。例如:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- -------- - ------------------------ ----- -------- - ------------------- ---------------------- --------- ---------- ---------------- -------- --------- -- - -------------------- -------- --------- -- ------------ -- - --------------------- ---
上述代码中,promise2 被拒绝,导致整个 Promise.all() 被拒绝,后续代码无法执行。
Promise.allSettled() 的解决方案
ES9 中,新增了 Promise.allSettled() 方法,可以在所有 Promise 对象都完成后返回一个包含每个 Promise 状态的数组,无论 Promise 对象是否成功。例如:
const promise1 = Promise.resolve(1); const promise2 = Promise.reject('error'); const promise3 = Promise.resolve(3); Promise.allSettled([promise1, promise2, promise3]) .then(results => { console.log(results); });
上述代码中,即使 promise2 被拒绝,Promise.allSettled() 也会返回一个包含每个 Promise 状态的数组,结果如下:
[ {status: 'fulfilled', value: 1}, {status: 'rejected', reason: 'error'}, {status: 'fulfilled', value: 3} ]
Promise.allSettled() 的应用场景
Promise.allSettled() 方法可以用于在多个异步任务完成后,对每个任务的状态进行处理。例如:
-- -------------------- ---- ------- ----- ---- - ---------------------------------------- ----------------------------------------- ------------------------------- -- ------------ ------------- -- - ---------------------- -- - -- -------------- --- ------------ - -------------------------- - ---- - --------------------------- - --- ---
上述代码中,Promise.allSettled() 方法用于等待多个异步请求完成后,对每个请求的结果进行处理。
总结
ES9 新增的 Promise.allSettled() 方法解决了 Promise.all() 方法在其中一个 Promise 对象出现错误时无法继续执行的问题。它可以在所有 Promise 对象都完成后返回一个包含每个 Promise 状态的数组,无论 Promise 对象是否成功。在实际开发中,我们可以使用 Promise.allSettled() 方法来等待多个异步任务完成后,对每个任务的状态进行处理。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6507e42b95b1f8cacd3131dc