Promise 和 async/await 编程模式实现异步编程

阅读时长 7 分钟读完

在前端开发中,异步编程是必不可少的。它可以提高应用程序的性能和用户体验,但是也引入了许多复杂性。在过去,回调函数是实现异步编程的常用方式,但它已经被 Promise 和 async/await 编程模式所取代。本文将深入讨论这两种编程模式,并介绍如何在实践中使用它们。

Promise 编程模式

Promise 是一种解决异步编程的方案,它是一个对象,代表了一个异步操作的最终完成或失败。Promise 对象包含了异步操作所返回的结果或错误信息。

Promise 的三种状态

Promise 对象有三种状态:

  • Pedding(等待):初始状态,既不是成功,也不是失败状态。
  • Fulfilled(成功):表示操作成功完成,返回了结果。
  • Rejected(失败):表示操作失败,返回了错误信息。

一旦 Promise 的状态从 Pedding 转移到 Fulfilled 或 Rejected,就不能再改变状态了。

Promise 的基本使用

Promise 的基本使用如下:

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

首先,我们创建一个 Promise 对象。在 Promise 的构造函数中,我们可以执行异步操作。如果异步操作成功,我们调用 resolve 函数并传递异步操作的结果;如果异步操作失败,我们调用 reject 函数并传递错误信息。

然后,我们使用 then 方法来处理 Promise 对象的成功情况,使用 catch 方法来处理 Promise 对象的失败情况。在 then 函数中,我们可以访问异步操作返回的结果,而在 catch 函数中,我们可以得到异步操作发生错误时的错误信息。

Promise 的链式调用

Promise 还允许我们将多个异步操作链接在一起,形成一个 Promise 链。

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

在 Promise 链中,每个 Promise 对象的成功处理函数会返回一个新的 Promise 对象,从而形成了 Promise 链。

Promise.all 的使用

Promise.all 可以用来并行处理多个 Promise 对象,并等待它们都完成后再执行后续操作。它的基本使用如下:

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

在 Promise.all 中,我们将多个 Promise 对象作为数组传递给它。当所有 Promise 对象都成功完成时,Promise.all 返回一个数组,其中包含每个 Promise 对象的结果。如果其中任何一个 Promise 对象失败,Promise.all 就会立即调用 catch 函数。

async/await 编程模式

async/await 是一种更简洁的异步编程方式。它基于 Promise,但使用起来更加方便。

async/await 的使用

使用 async/await,我们可以将异步函数声明为 async,然后使用 await 关键字等待异步操作完成。

在异步函数中,我们使用 await 关键字等待一个 Promise 对象。async 函数会暂停执行,直到 Promise 对象被 resolved 或 rejected。

async/await 的异常处理

与 Promise 类似,我们可以使用 try/catch 语句处理异步函数的异常。

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

async/await 的链式调用

使用 async/await,我们可以像同步代码一样,使用函数调用的方式链接异步函数。

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

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

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

在这个例子中,我们按顺序调用了 bar 和 baz 异步函数,等待它们的结果并使用它们执行后续操作。

结论

Promise 和 async/await 编程模式都是强大的异步编程工具。它们能够简化异步编程,并提高代码的可读性和可维护性。

在实践中,我们可以根据具体的需求选择使用 Promise 还是 async/await 编程模式。在处理多个异步操作时,我们可以使用 Promise.all 来并行处理它们。而在实现更复杂的异步操作时,async/await 编程模式可能更为合适。

示例代码

下面是一个使用 Promise 和 async/await 实现异步编程的示例代码:

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

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

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

纠错
反馈