ES2020 新特性:Promise.allSettled 详解

在 JavaScript 的异步编程中,Promise 是一个非常常见的 API。Promise 可以让我们更加优雅地处理异步操作,以及避免回调地狱的问题。在 ES2020 中,Promise 又新增了一个非常实用的特性:Promise.allSettled。本文将为大家详解 Promise.allSettled 的用法和实际应用。

Promise.allSettled 的作用

Promise.allSettled 是 Promise 的一个静态方法,它接受一个 Promise 数组作为参数,并返回一个 Promise 对象。这个 Promise 对象在所有 Promise 都已经完成(fulfilled 或者 rejected)时才会 resolve。与 Promise.all 不同的是,Promise.allSettled 不会在任何一个 Promise 被 rejected 时就立即 reject,而是会等到所有 Promise 都完成后,才会返回结果。

Promise.allSettled 返回的结果是一个数组,数组中的每个元素都是一个对象,该对象包含了对应 Promise 的状态和返回值。如果 Promise 被 fulfilled,则对象中会包含一个 status 属性,值为 "fulfilled",并且还会包含一个 value 属性,表示 Promise 的返回值;如果 Promise 被 rejected,则对象中会包含一个 status 属性,值为 "rejected",并且还会包含一个 reason 属性,表示 Promise 的拒因。

Promise.allSettled 的使用场景

Promise.allSettled 的主要作用是在多个异步操作执行完毕后,统一处理它们的返回结果。

举个例子,假设我们有一个应用程序,需要从多个不同的 API 获取数据,然后将这些数据进行合并。我们可以使用 Promise.allSettled 来等待所有 API 的响应,然后再对响应进行处理。在这种情况下,我们不需要知道哪些 API 失败了,只需要知道所有 API 的返回结果即可。

const api1 = fetch('https://example.com/api1')
const api2 = fetch('https://example.com/api2')
const api3 = fetch('https://example.com/api3')

Promise.allSettled([api1, api2, api3])
  .then(results => {
    const data = []
    results.forEach(result => {
      if (result.status === 'fulfilled') {
        data.push(result.value)
      }
    })
    // 对数据进行处理
  })

Promise.allSettled 的实现方法

在 ES2020 之前,我们可以使用 Promise.all 和 catch 方法来实现类似的功能。但是,Promise.all 会在任何一个 Promise 被 rejected 时就立即 reject,这可能并不是我们想要的结果。因此,我们需要对 Promise.all 的返回结果进行处理,以区分哪些 Promise 被 rejected 了。

const api1 = fetch('https://example.com/api1')
const api2 = fetch('https://example.com/api2')
const api3 = fetch('https://example.com/api3')

Promise.all([api1, api2, api3].map(promise => {
  return promise.then(value => {
    return { status: 'fulfilled', value }
  }, reason => {
    return { status: 'rejected', reason }
  })
}))
  .then(results => {
    const data = []
    results.forEach(result => {
      if (result.status === 'fulfilled') {
        data.push(result.value)
      }
    })
    // 对数据进行处理
  })

在上面的代码中,我们使用了 Promise.all 和 map 方法来实现类似 Promise.allSettled 的功能。我们在每个 Promise 的 then 方法中,都返回一个包含 status 和 value/reason 属性的对象。这样,我们就可以在 Promise.all 返回的数组中,通过遍历每个对象的 status 属性来区分哪些 Promise 被 rejected 了。

总结

Promise.allSettled 是 ES2020 中新增的一个非常实用的 Promise 方法,它可以让我们更加优雅地处理多个异步操作的返回结果。通过本文的介绍,相信大家已经对 Promise.allSettled 的用法和实现方法有了更深入的了解。在实际开发中,我们可以根据具体的场景选择合适的 Promise 方法来优化我们的代码。

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