ES2018 为 Promise 付了个章

阅读时长 4 分钟读完

在 ES2018 中,Promise 得到了重要的增强,以提供更加强大和有用的功能。本文将深入探讨这些增强,以及如何正确地使用它们来提高 JavaScript 应用程序的可靠性和性能。

异步迭代

在 ES2018 中,Promise 可以被用作可异步迭代的对象,类似于数组和其他迭代器。异步迭代是指一个异步函数能够多次产生值,每次值的产生可能需要一些等待时间。

考虑如下示例代码:

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

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

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

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

上述代码中,我们首先定义了一个异步函数 makeRequest,它接收一个 URL 并返回 JSON 数据。接着,我们定义了一个 URL 数组,然后定义了一个异步函数 requestData。此函数使用了 for-await-of 语法迭代 makeRequest 返回的 Promise 对象。每一个迭代步骤都必须等待前一个请求完成,因此我们可以确保顺序执行这些请求,而不会出现并发请求所带来的问题。

Promise.prototype.finally()

ES2018 还引入了 Promise.prototype.finally() 方法,该方法使用回调函数作为参数,该回调函数将在 Promise 被 resolved 或 rejected 时被执行。Promise.prototype.finally() 方法不接收任何参数,并返回原始 Promise。

考虑以下示例代码:

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

上述代码中,我们使用 fetch API 发送请求,并在处理响应的回调函数中使用了 Promise.prototype.finally() 方法来在请求完成后执行某些操作(例如清除加载指示器等)。不管该 Promise 是否被 resolved 或 rejected, .finally() 回调函数都将被执行。

Promise.allSettled()

ES2018 还引入了 Promise.allSettled() 方法,该方法会接收一个 Promise 数组,并返回一个新的 Promise 对象,该对象将在所有给定的 Promise 对象都被 settled(已解决或已拒绝)后被 resolved。

考虑以下示例代码:

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

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

上述代码中,我们首先定义了一个包含成功和失败 Promise 的数组,然后使用 Promise.allSettled() 方法来返回一个新的 Promise 对象。在该对象被 resolved 时,将通过 forEach() 方法遍历结果数组,并根据成功或失败状态输出相应的数据。这样,我们可以在处理多个 Promise 时,确保处理成功和失败状态的数据,而不必使用 Promise.all() 方法一次性处理所有 Promise。

结论

ES2018 为 Promise 带来了强大的功能,让我们能够更好地利用 JavaScript 异步编程的优势。通过了解并正确使用上述新增功能,我们可以提高 JavaScript 应用程序的可靠性和性能,让程序开发和维护变得更加容易。

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

纠错
反馈