在 ES2020 中,Promise.allSettled 是一个新增的方法,它的作用是在所有的 Promise 实例都完成后返回一个状态,表示每个 Promise 实例的结果,而不管其中是否有 Promise 抛出异常。
语法和返回值
Promise.allSettled 方法的语法如下:
Promise.allSettled(promises)
其中,promises 是一个由 Promise 实例组成的数组。
当所有 Promise 实例都settled,即成功或失败时,Promise.allSettled 的返回值是一个新的 Promise 实例,并且这个 Promise 实例的状态是 fulfilled。
返回值的状态和值
Promise.allSettled 返回的 Promise 实例的状态有以下两种可能:
所有 Promise 实例都成功,Promise.allSettled 返回的 Promise 实例状态为 fulfilled。
有 Promise 实例抛出异常,Promise.allSettled 返回的 Promise 实例状态为 fulfilled。
返回值的值是一个由所有 Promise 实例状态的结果组成的数组,数组中的每个元素都是一个对象,它有两个属性:status 和 value。
当 Promise.allSettled 返回的 Promise 实例状态为 fulfilled 时,各 Promise 实例状态的结果如下:
- 如果 Promise 实例成功,那么 status 属性的值为 "fulfilled",value 属性的值是成功的返回值。
- 如果 Promise 实例失败,那么 status 属性的值为 "rejected",value 属性的值是失败的原因。
使用示例
const p1 = Promise.resolve(1); const p2 = Promise.reject(2); const p3 = new Promise(resolve => setTimeout(resolve, 1000, 3)); // 异步操作,等待 1s 的时间后返回 3 Promise.allSettled([p1, p2, p3]).then(results => { console.log(results); });
以上代码中,我们定义了三个 Promise 实例:p1 成功并返回值为 1,p2 失败并抛出异常,p3 是一个异步操作,在 1 秒后返回结果 3。我们将这三个 Promise 实例放入 Promise.allSettled 中,并打印结果。
结果如下:
[ { status: 'fulfilled', value: 1 }, { status: 'rejected', reason: 2 }, { status: 'fulfilled', value: 3 } ]
从结果可以看出,虽然 Promise.allSettled 的参数中包含了一个抛出异常的 Promise 实例,但最终 Promise.allSettled 返回的 Promise 实例状态依然为 fulfilled,并且返回了包括这个异常 Promise 实例在内的所有 Promise 实例的状态结果。
总结
Promise.allSettled 是一个非常实用的方法,它能够返回所有 Promise 实例执行后的状态和值,不管其中是否有异常抛出。这个方法的引入让我们在开发中能够更方便地处理多个 Promise 实例的状态,并取得它们的值,帮助我们更好地实现异步操作。
对于那些使用 Promise 实现异步操作的前端开发人员来说,掌握 Promise.allSettled 方法不仅能够提高代码的效率,还可以帮助他们更好地理解异步编程的实现过程。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65347aa47d4982a6eb90a880