简介
Promise.allSettled() 方法是一个新的 ES2020 提供的 API,可以用来等待所有 Promise 对象的状态变化。不同于 Promise.all(),Promise.allSettled() 方法不会提前退出,而是继续等待所有 Promise 对象的状态变化。
Promise.allSettled() 方法返回包含所有 Promise 对象结果的数组。每个结果包含一个 status 属性,该属性表示 Promise 对象状态是否是 fulfilled 或者是 rejected。如果状态是 fulfilled,那么结果数组中的一个 value 属性将包含 Promise 对象返回的值,如果状态是 rejected,那么结果数组中的一个 reason 属性将包含 Promise 对象抛出的错误。
用法
Promise.allSettled() 方法接收一个 Promise 对象组成的数组,然后返回一个 Promise 对象。如果传入的数组中的 Promise 对象全部为 fulfilled 状态,则 Promise.allSettled() 返回的 Promise 对象就是 fulfilled 状态,返回的结果是一个包含所有 Promise 对象结果的数组。如果传入的数组中有一个或多个 Promise 对象处于 rejected 状态,则 Promise.allSettled() 返回的 Promise 对象就是 fulfilled 状态,返回的结果是一个包含所有 Promise 对象结果的数组,即使有 Promise 对象被 rejected,也不会中断 Promise.allSettled() 方法的执行。
Promise.allSettled([promise1, promise2, promise3]) .then(results => { console.log(results); }) .catch(error => { console.log(error); });
实例
示例 1
代码:
// javascriptcn.com 代码示例 const promises = [ Promise.resolve('foo'), Promise.reject('bar'), Promise.resolve('baz'), ]; Promise.allSettled(promises).then((results) => { console.log(results); });
结果:
[ {status: "fulfilled", value: "foo"}, {status: "rejected", reason: "bar"}, {status: "fulfilled", value: "baz"} ]
解释:
上述代码中,promises 数组包含三个 Promise 对象。第一个对象会返回 'foo',第二个对象会直接抛出 'bar',第三个对象会返回 'baz'。因此,Promise.allSettled() 返回的结果数组中包含三个元素,分别是 { status: "fulfilled", value: "foo" }
、{ status: "rejected", reason: "bar" }
、{ status: "fulfilled", value: "baz" }
。
示例 2
代码:
// javascriptcn.com 代码示例 const promises = [ Promise.resolve('foo'), new Promise((resolve, reject) => setTimeout(() => reject('bar'), 500)), Promise.resolve('baz'), ]; Promise.allSettled(promises).then((results) => { console.log(results); });
结果:
[ {status: "fulfilled", value: "foo"}, {status: "rejected", reason: "bar"}, {status: "fulfilled", value: "baz"} ]
解释:
上述代码中,第二个 Promise 对象会在 500 毫秒后抛出 'bar',而其他两个对象在立即返回 'foo' 和 'baz'。由于 Promise.allSettled() 方法不会提前退出,因此在第二个 Promise 对象抛出错误前,Promise.allSettled() 方法会一直等待,最后返回包含所有结果的数组,即使其中一个 Promise 对象被 rejected。
总结
Promise.allSettled() 方法是一个非常实用的 API,可以让我们更方便地处理多个 Promise 对象的状态变化。与 Promise.all() 不同的是,Promise.allSettled() 不会提前退出,而是继续等待所有 Promise 对象的状态变化。同时,返回的结果也更加详细,包含每个 Promise 对象的状态及其返回值或错误原因。
在使用 Promise.allSettled() 方法时,我们需要注意代码的执行顺序,以及如何处理返回的结果数组。当然,我们也可以充分运用 Promise.all() 和 Promise.race() 等其他 API,来更好地处理异步编程中的逻辑。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652ffa367d4982a6eb148f0d