细说 ES12 中改进的 Promise.allSettled() 方法

在 ES6 中引入 Promise 以来,JavaScript 中的异步编程得到了重大的改进。Promise 最大的优势在于其可以解决回调地狱问题,并且可以比较方便地处理异步操作的结果。而 Promise.all() 方法则是 Promise 的一个重要特性,允许我们将多个 Promise 实例包装成一个 Promise 对象,只有所有 Promise 完成时,该 Promise 才完成。

但是,在 Promise.all() 中,只要有一个 Promise 被拒绝,整个 Promise 对象就会被拒绝,这可能不是我们希望看到的结果。而 ES12 中新增的 Promise.allSettled() 方法,则可以处理这个问题。

Promise.allSettled() 方法的具体用法

Promise.allSettled() 方法与 Promise.all() 方法类似,唯一的区别是,即使其中一个 Promise 被拒绝,整个 Promise 对象仍然会被解决,只是其中被拒绝的 Promise 会在结果数组中以特定的方式被返回。

具体来说,Promise.allSettled() 方法会返回一个由对应 Promise 结果对象组成的数组。每个结果对象都有一个 status 属性,表示该 Promise 的状态,值为 "fulfilled""rejected",还有一个 valuereason 属性,分别表示该 Promise 的解决值或拒绝原因。

下面是 Promise.allSettled() 方法的用法示例:

const promises = [
  Promise.resolve(3),
  Promise.reject(new Error('failed')),
  Promise.resolve(1),
];

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

执行结果如下:

[
  { status: 'fulfilled', value: 3 },
  { status: 'rejected', reason: Error: failed at ... },
  { status: 'fulfilled', value: 1 }
]

上述示例中,Promise.reject() 会被拒绝,但是整个 Promise 对象仍被解决。返回结果中,第二个结果对象具有一个 status 属性值为 "rejected",并且还有一个 reason 属性,其值为被拒绝的原因。

Promise.allSettled() 方法的学习意义

使用 Promise.allSettled() 可以避免因为一个 Promise 被拒绝而导致整个 Promise 对象被拒绝的问题。这不仅让我们更方便地编写异步代码,还可以让我们认识到,即使有些异步操作失败了,整个程序仍然可以继续执行,这为我们更好地处理错误提供了更多的思路。

此外,Promise.allSettled() 方法还可以很方便地帮助我们实现对多个异步操作的聚合。通过对所有 Promise 结果对象的处理,我们可以非常容易地对这些异步操作的结果进行聚合、统计和分析。

总结

ES12 中新增的 Promise.allSettled() 方法是 Promise 的一个重要扩展,在处理多个 Promise 实例的时候具有重要的意义。它可以解决因一个 Promise 被拒绝导致整个 Promise 对象被拒绝的问题,并且还可以帮助我们更加优雅、灵活地编写异步代码。同时,学习 Promise.allSettled() 方法也能够让我们更好地认识异步编程的本质,并且提供更多的思路和技巧。

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