在 JavaScript 编程中,异步操作是常见的,例如通过网络请求获取数据、定时器等等。在异步编程中,经常使用 Promise 来处理异步请求。ES6 中新增了 Promise.all() 方法,用于并行请求多个 Promise,但是在实际开发中,我们通常也需要对 Promise 的处理进行更多的优化和扩展。
在 ES12 (ES2021) 中,我们拥有了 Promise.any() 和 Promise.allSettled() 两个新的 Promise 方法。
Promise.any()
Promise.any() 方法返回一个新的 Promise,只要其中一个 Promise 实例有一个变成 Fulfilled 状态,则返回该 Promise 的结果。如果所有 Promise 都变成了 Rejected 状态,则返回一个 AggregateError,其中存放所有 Promise 的 Rejected 原因数组。
Promise.any() 相当于 Promise.race() 方法的扩展,因为它可以处理多个 Promise 实例,而且只要其中一个 Promise 实例返回了结果,整个 Promise 就会被成功处理。
示例代码:
const promise1 = Promise.resolve(1); const promise2 = Promise.reject(Error('error1')); const promise3 = Promise.reject(Error('error2')); Promise.any([promise1, promise2, promise3]) .then((value) => console.log(value)) .catch((error) => console.error(error)); // 输出 1
Promise.allSettled()
Promise.allSettled() 方法返回一个 Promise 实例,该 Promise 实例在所有 Promise 结束后返回一个对象数组,其中每个对象都表示相应的 Promise 结果(不管是 Fulfilled 还是 Rejected)。
这种方法类似于 Promise.all() 方法,不同之处在于 Promise.allSettled() 不会在任何 Promise 拒绝时拒绝整个 Promise。这意味着 even if some Promises failed,我们仍然可以处理其他 Promise 的结果,而不必担心只要有一个 Promise 失败就使整个 Promise 失败。
示例代码:
-- -------------------- ---- ------- ----- -------- - ------------------- ----- -------- - ------------------------------- ----------------------------- ---------- --------------- -- --------------------- -------------- -- ---------------------- -- -- - -------- ------------ ------ --- -------- ----------- ------- ------ ------ - --
总结
ES12 中的 Promise.any() 和 Promise.allSettled() 方法为我们在异步编程中提供了更多的灵活性和选择。通过使用这些方法,我们可以更好地处理多个异步操作,并准确地处理它们的结果。在开发实践中,利用这些新的 Promise 方法可以使我们的代码更加简洁,高效和可维护。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f704e2f6b2d6eab3f946e8