ECMAScript 2021 引入 Promise.any 和 AggregateError,优化异步编程

前言

在现代 web 应用中,异步编程已经成为了不可避免的一部分。在过去的几年中,JavaScript 通过 Promise 和 async/await 等机制使得异步编程变得更加容易和直观。ECMAScript 2021 新增了 Promise.any 和 AggregateError 两个功能,可以进一步优化异步编程体验。

Promise.any

Promise.any 与 Promise.all 的作用类似,都是接受一个 Promise 数组作为参数,返回一个 Promise 对象。只有当参数数组中的任意一个 Promise 对象变为 fulfilled 状态后,该 Promise.any 对象就会被 resolved。如果参数数组中所有 Promise 对象都是 rejected 状态,该 Promise.any 对象就会被 rejected,并返回 AggregateError 对象。

Promise.any 的语法如下:

Promise.any(iterable);

其中 iterable 是一个可迭代对象,例如数组或者 Set。

下面是一个使用 Promise.any 的示例代码:

const promises = [
  Promise.reject(1),
  Promise.reject(2),
  Promise.resolve(3)
];

Promise.any(promises)
  .then(value => console.log(value))
  .catch(error => console.log(error));

在上面的代码中,我们传入了一个包含三个 Promise 对象的数组 promises。前两个 Promise 对象是 rejected 状态,而第三个 Promise 对象是 fulfilled 状态,因此最后的结果会打印出 3

AggregateError

在Promise.any 中,如果参数数组中的所有 Promise 对象都是 rejected 状态,会返回一个新的构造函数 AggregateError 的对象。该对象包含了所有错误对象的列表,可以让我们方便地处理多个错误。

AggregateError 的语法如下:

new AggregateError(errors, message);

其中 errors 是一个数组,表示所有的错误对象列表,而 message 是一个可选的字符串,表示错误信息。

下面是一个使用 AggregateError 的示例代码:

const promises = [
  Promise.reject(new Error('error 1')),
  Promise.reject(new TypeError('error 2'))
];

Promise.any(promises)
  .then(value => console.log(value))
  .catch(error => {
    if (error instanceof AggregateError) {
      for (const err of error.errors) {
        console.log(err.message);
      }
    }
  });

在上面的代码中,我们传入了包含两个 Promise 对象的数组 promises,并且两个 Promise 对象都是 rejected 状态。在 Promise.any 返回的错误中,我们可以通过遍历 error.errors 来获取所有的错误对象,并打印出其错误信息。

总结

ECMAScript 2021 引入的 Promise.any 和 AggregateError 对于异步编程来说是非常实用的工具。Promise.any 可以优化在多个异步操作中仅需要其中任意一个成功时的判断逻辑,而 AggregateError 可以方便地处理多个错误。需要注意的是,Promise.any 和 AggregateError 目前只被部分浏览器支持,建议在作为项目依赖前先进行检查。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65a4ad4eadd4f0e0ffcff0d9


纠错反馈