使用 ES9 中的 Promise.allSettled() 来处理多个 Promise 的结果

ES9 中新增了 Promise.allSettled() 方法,它可以让我们更方便地处理多个 Promise 的结果。

在之前的 Promise.all() 中,当其中一个 Promise 被 reject 时,整个 Promise.all() 也会失败,并返回该 Promise 的错误信息,而 Promise.allSettled() 则不同,不论 Promise 的状态是 fulfilled 还是 rejected,它都会等待所有 Promise 执行完毕,并返回一个数组,该数组中的每个元素都包含了这些 Promise 的状态以及结果或错误信息。

Promise.allSettled() 的参数是一个 Promise 数组,以一个简单的示例说明如下:

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

Promise.allSettled(promises)
  .then(results => console.log(results))
  .catch(error => console.error(error));

结果输出:

Promise.allSettled() 返回的数组中,每个元素都是一个对象,它包含两个属性:status 和 value 或 reason,分别表示 Promise 的状态和结果或错误信息。如果 Promise 被 resolve,那么 status 的值为 'fulfilled',value 的值为 Promise 的结果;如果 Promise 被 reject,那么 status 的值为 'rejected',reason 的值为 Promise 的错误信息。

有了 Promise.allSettled(),我们可以更方便地处理多个 Promise 的结果,例如:

const fetchApiData = url => fetch(url).then(response => response.json());

const urls = [
  'https://jsonplaceholder.typicode.com/todos/1',
  'https://jsonplaceholder.typicode.com/todos/2',
  'https://jsonplaceholder.typicode.com/todos/3',
];

Promise.allSettled(urls.map(fetchApiData))
  .then(results => results.filter(result => result.status === 'fulfilled').map(result => result.value))
  .then(console.log)
  .catch(console.error);

这是一个请求多个 API,然后过滤出请求成功的结果的示例。使用 Promise.allSettled() 的好处在于:

  • 不需要使用 try...catch 包裹每个 Promise 的执行结果,避免代码冗长。
  • 不用担心某个被 reject 的 Promise 会影响其他 Promise 的执行结果,而要进行额外的处理。

总结

Promise.allSettled() 是 ES9 提供的一个新的方法,它可以更方便地处理多个 Promise 的结果,无论是 fulfilled 还是 rejected 状态,都可以获取到结果或错误信息。使用 Promise.allSettled() 的好处在于代码更加简洁明了,同时也可以避免某个 Promise 造成的异常影响其他 Promise 的执行结果。

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


纠错反馈