在 ES8 中使用 Promise.allSettled() 处理异步请求

阅读时长 4 分钟读完

什么是 Promise.allSettled()?

Promise.allSettled() 是 ES2020(或 ES8)引入的一个新方法,它接受一个 Promise 数组作为参数,并返回一个 Promise,该 Promise 在所有传入的 Promise 都已解析之后才解析,而不像 Promise.all() 在任何一个 Promise 被拒绝时就拒绝。

返回的 Promise 将解析为一个数组,其中包含所有传入的 Promise 的状态,每个状态都是包含以下属性的对象:

  • status: 对应每个 Promise 的状态,可能的值为 fulfilledrejected
  • value: 如果状态是 fulfilled,则为解析的值;如果状态是 rejected,则为拒绝的原因

如何使用 Promise.allSettled()?

使用 Promise.allSettled() 可以轻松地处理一组异步操作,并获取每个操作的结果,无论成功或失败。

例如,我们可以使用 Promise.allSettled() 获取多个 HTTP 请求的结果:

-- -------------------- ---- -------
----- ---- - -
  ------------------------------------
  ------------------------------------
  ------------------------------------
--

----- -------- - ------------ -- ------------

----------------------------
  --------------- -- -
    -------------------------- -- -
      -- ---------------- --- ------------ -
        ----------------------------
      - ---- -
        -------------------------------
      -
    ---
  ---

这段代码创建了一个包含三个 URL 的数组,并使用 fetch() 方法发出了三个 HTTP 请求。然后,使用 map() 方法将每个 URL 转换为一个 Promise,并将这些 Promise 存储在 requests 数组中。最后,Promise.allSettled(requests) 方法将这些 Promise 作为参数传递,并返回一个新的 Promise。

当所有的 Promise 解析完毕时,Promise.allSettled() 解析的 Promise 将被解析,并将一个对象数组传递给处理程序。在此示例中,我们使用 forEach() 方法遍历该数组,并根据每个 Promise 的状态进行相应的操作。

与 Promise.all() 的比较

与 Promise.all() 不同,Promise.allSettled() 不会在任何一个 Promise 被拒绝时就拒绝。因此,即使其中一些 Promise 被拒绝,仍然可以处理其余的 Promise。

例如,如果我们将上面的示例更改为使用 Promise.all():

如果其中一个请求被拒绝,Promise.all() 将立即拒绝并返回该错误。这意味着即使其中两个请求成功了,它们也无法被处理。

总结

Promise.allSettled() 是一个有用的新方法,可以处理多个异步操作,并获取每个操作的结果,无论是成功还是失败。它在 ES8 中引入,并已成为现代 JavaScript 的一个重要功能。

与 Promise.all() 不同,Promise.allSettled() 不会在任何一个 Promise 被拒绝时拒绝,这意味着即使其中一些 Promise 被拒绝,仍然可以处理其余的 Promise。

示例代码:####

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64525e54968c7c53b06fcf90

纠错
反馈