如何在 Node.js 中优雅地使用 Promises

阅读时长 8 分钟读完

Promises 是一种处理异步操作的流行方式。它们是一种更优雅的方式来处理回调地狱,让代码更易于阅读和维护。在 Node.js 中,Promises 很容易使用,但是有一些技巧可以让你更好地利用它们。

Promises 是什么?

Promises 是 JavaScript 中一种处理异步操作的方式。它们是一种在未来某个时间点返回值的占位符。Promises 可以有三个状态:

  • Pending(等待):Promise 正在等待执行结果。
  • Fulfilled(成功):Promise 已经成功地执行。
  • Rejected(拒绝):Promise 执行失败。

Promises 可以让你更好地处理异步操作,而不是嵌套回调函数。它们可以让你更好地控制流程,以及更好地处理错误。

Promises 的基础用法

在 Node.js 中,你可以使用内置的 Promise 构造函数来创建 Promises。这个构造函数接受一个函数作为参数,这个函数将在 Promise 被创建时立即执行。这个函数接受两个参数:resolvereject。这些参数是函数,当 Promise 被解决或拒绝时将被调用。

在 Promise 被创建后,你可以使用 .then() 方法来添加一个回调函数,当 Promise 被解决时调用。你可以使用 .catch() 方法来添加一个回调函数,当 Promise 被拒绝时调用。这些方法都返回一个新的 Promise,允许你将多个操作链接在一起。

在 Node.js 中使用 Promises

在 Node.js 中,你可以使用 Promises 来处理几乎所有的异步操作。例如,你可以使用 Promises 来读取文件、发送 HTTP 请求、连接数据库,等等。

读取文件

在 Node.js 中,你可以使用 fs 模块来读取文件。fs.readFile() 方法是异步的,可以使用 Promises 来处理它。

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

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

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

发送 HTTP 请求

在 Node.js 中,你可以使用 http 模块来发送 HTTP 请求。http.request() 方法是异步的,可以使用 Promises 来处理它。

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

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

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

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

连接数据库

在 Node.js 中,你可以使用 mysql 模块来连接 MySQL 数据库。mysql.createConnection() 方法是异步的,可以使用 Promises 来处理它。

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

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

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

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

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

Promise.all() 和 Promise.race()

在 Node.js 中,你可以使用 Promise.all()Promise.race() 方法来处理多个 Promises。

Promise.all()

Promise.all() 方法接受一个 Promises 数组作为参数,并返回一个新的 Promise。当所有的 Promises 都被解决时,这个 Promise 将被解决,并传递一个结果数组。如果任何一个 Promise 被拒绝,这个 Promise 将被拒绝,并传递一个错误。

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

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

Promise.race()

Promise.race() 方法接受一个 Promises 数组作为参数,并返回一个新的 Promise。当任何一个 Promise 被解决或拒绝时,这个 Promise 将被解决或拒绝,并传递一个结果或错误。

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

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

结论

Promises 是一种更优雅的异步操作处理方式。在 Node.js 中,你可以使用 Promises 来处理几乎所有的异步操作。使用 .then().catch() 方法来处理 Promises 的解决和拒绝。使用 Promise.all()Promise.race() 方法来处理多个 Promises。使用 Promises 可以让你的代码更易于阅读和维护。

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

纠错
反馈