ECMAScript 2020 中新增的 Promise.allSettled() 解决 Promise 并行问题
在前端开发中,我们经常需要同时发起多个异步请求并等待它们全部完成后再进行下一步操作。这时候,我们通常会使用 Promise.all() 方法来解决这个问题。但是,Promise.all() 方法只有在所有 Promise 都 resolve 或者有一个 reject 的时候才会返回结果,如果其中一个 Promise 失败了,那么其他 Promise 的结果就无法得到。这个问题在一些场景中可能会导致应用的崩溃。
幸运的是,在 ECMAScript 2020 中,Promise.allSettled() 方法被添加到了 Promise API 中,它可以解决 Promise 并行问题,即使其中一个 Promise 失败了,也可以得到其他 Promise 的结果。
Promise.allSettled() 方法接受一个 Promise 数组作为参数,并返回一个新的 Promise,这个 Promise 在所有输入的 Promise 都 settle(不管是 resolve 还是 reject)之后才会 resolve。resolve 的结果是一个对象数组,每个对象包含了对应的 Promise 的状态和值。
下面是一个使用 Promise.allSettled() 方法的例子:
// javascriptcn.com 代码示例 const promises = [ Promise.resolve(1), Promise.reject(new Error('fail')), Promise.resolve(3) ]; Promise.allSettled(promises) .then(results => { console.log(results); }) .catch(error => { console.log(error); });
输出结果如下:
[ { status: 'fulfilled', value: 1 }, { status: 'rejected', reason: Error: fail }, { status: 'fulfilled', value: 3 } ]
可以看到,即使其中一个 Promise 失败了,Promise.allSettled() 方法也会返回其他 Promise 的状态和值。
除了解决 Promise 并行问题,Promise.allSettled() 方法还有以下优点:
- 可以得到所有 Promise 的状态和值,即使其中一个 Promise 失败了。
- 可以减少代码的复杂度和冗余,避免使用 try-catch 语句来处理每个 Promise 的错误。
在实际开发中,我们可以使用 Promise.allSettled() 方法来处理多个异步请求,并根据返回的结果来执行下一步操作。
总结起来,Promise.allSettled() 方法是 ECMAScript 2020 中新增的 API,用于解决 Promise 并行问题,并且可以得到所有 Promise 的状态和值,即使其中一个 Promise 失败了。在实际开发中,我们可以使用它来简化代码,并提高应用的健壮性。
参考代码:
// javascriptcn.com 代码示例 const promises = [ Promise.resolve(1), Promise.reject(new Error('fail')), Promise.resolve(3) ]; Promise.allSettled(promises) .then(results => { console.log(results); const values = results.filter(result => result.status === 'fulfilled').map(result => result.value); console.log(values); }) .catch(error => { console.log(error); });
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6576e478d2f5e1655d065179