前言
ES2020 在 Promise 方面又加了一项新功能:Promise.allSettled 方法。该方法解决了 Promise.all 方法中的缺陷,它可以让我们并行执行一组异步操作,并将结果按照执行顺序返回。
Promise.all 方法存在的问题
在介绍 Promise.allSettled 方法之前,我们先来看看 Promise.all 方法存在的问题。
Promise.all 方法接收一个 Iterable 对象,它里面的元素都是 Promise 对象。如果其中任何一个 Promise 对象变成了 rejected 状态,Promise.all 就会立即中断并将该 Promise 对象的错误信息返回。如果所有的 Promise 对象都变成了 fulfilled 状态,Promise.all 才会返回一个包含所有 Promise 返回值的数组。
这种中断式的表现方式对于一些应用场景来说并不是很适合,比如我们需要执行一组异步操作,然后处理它们的执行结果,并不希望一个错误的 Promise 对象就立即中断整个异步操作。
Promise.allSettled 方法的优势
Promise.allSettled 方法的作用是并行执行一组异步操作,并将它们的执行结果按照执行顺序返回,即使其中的 Promise 对象变成了 rejected 状态,该方法也不会中断整个异步操作。
这意味着我们可以更加安全和自信地使用 Promise.allSettled 方法来处理一些不确定性的异步操作,不必担心中途因为某个 Promise 对象的错误信息而中断整个操作。
Promise.allSettled 方法的用法
Promise.allSettled 方法的用法很简单,它接收一个 Iterable 对象,里面的元素都是 Promise 对象。在所有 Promise 对象都执行完毕后,Promise.allSettled 方法会返回一个数组,数组中包含每一个 Promise 对象执行结果的对象,该对象有两个属性:
status
:表示 Promise 对象的状态,可以是 "fulfilled" 或 "rejected"。value
:表示 Promise 对象的执行结果,如果状态是 "fulfilled",那么该属性就是 Promise 对象的返回值,如果状态是 "rejected",那么该属性就是 Promise 对象的错误信息。
示例代码
以下是一个使用 Promise.allSettled 方法的示例代码:
const promise1 = Promise.resolve(1); const promise2 = Promise.reject("oops"); const promise3 = Promise.resolve(3); Promise.allSettled([promise1, promise2, promise3]).then((results) => { console.log(results); });
上述代码中,我们创建了一个包含三个 Promise 对象的数组,其中第二个 Promise 对象是一个 rejected 状态的 Promise 对象。我们使用 Promise.allSettled 方法来执行这三个 Promise 对象,然后在控制台中输出执行结果。
输出结果如下:
[ { status: "fulfilled", value: 1 }, { status: "rejected", reason: "oops" }, { status: "fulfilled", value: 3 } ]
总结
Promise.allSettled 方法是 ES2020 新增的一个非常有用的方法,它可以带来更加安全和自信的异步操作体验。当我们需要并行执行多个异步操作,并处理它们的执行结果时,可以尝试使用该方法。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65335df47d4982a6eb6e2ec0