ES6 中 Promise 的原理和实现方法详解

阅读时长 8 分钟读完

什么是 Promise

Promise 是一种异步编程的解决方案,它可以在异步操作成功或失败之后,分别执行相应的回调函数。Promise 使得异步操作更加优雅、简洁,并且防止了回调地狱的发生。

在 ES6 中,Promise 是一个构造函数,用来生成 Promise 实例。它最大的特点就是解决了回调地狱的问题,让我们的异步代码更加易读、易维护。

Promise 的原理

Promise 最关键的功能就是处理异步操作的状态。一个 Promise 有 3 种状态:

  • Pending(等待):初始状态,既不是成功,也不是失败状态。
  • Fulfilled(成功):指异步操作成功完成,此时会执行 .then() 方法指定的回调函数,并将异步操作的结果作为参数传递给回调函数。
  • Rejected(失败):指异步操作失败,此时会执行 .catch() 方法指定的回调函数,或是 .then() 方法的第二个参数指定的回调函数,同时将异步操作抛出的错误作为参数传递给回调函数。

当 Promise 的状态从 Pending 变成 Fulfilled(或 Rejected)后,Promise 的状态就不会再改变。

Promise 的实现方法

我们可以使用 JavaScript 来手写一个简单的 Promise,执行以下步骤:

定义 Promise 构造函数

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

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

  -- ------
  ----------- --------
-
展开代码

实现 Promise.then() 方法

-- -------------------- ---- -------
------------------------ - --------------------- ----------- -
  -- -- ----------- ------------------- ----- --
  ----------- - ------ ----------- --- ---------- - ----------- - --------------- - ------ ------ --
  -- -- ---------- ------------------- ----- --
  ---------- - ------ ---------- --- ---------- - ---------- - --------------- - ----- ------ --
  --- ---- - -----
  --- --------
  -- ------------ --- ---------- -
    -- ------ -------------------
    ------- - --- --------------------------- ------- -
      ------------------------------------- -
        --- -
          --- - - -------------------
          -- - - ------ ------- --- ------- --
          -----------
        - ----- ----- -
          -- --------------------- ------- --- ------ --
          -----------
        -
      ---
      ------------------------------------ -
        --- -
          --- - - ------------------
          -- - - ------ ------- --- ------- --
          -----------
        - ----- ----- -
          -- --------------------- ------- --- ------ --
          -----------
        -
      ---
    ---
  - ---- -- ------------ --- ------------ -
    -- ----- -------------- ----------- --
    ------- - --- --------------------------- ------- -
      --- -
        --- - - ------------------------
        -- - - ------ ------- --- ------- --
        -----------
      - ----- ----- -
        -- --------------------- ------- --- ------ --
        -----------
      -
    ---
  - ---- -- ------------ --- ----------- -
    -- ----- ------------- ---------- --
    ------- - --- --------------------------- ------- -
      --- -
        --- - - -----------------------
        -- - - ------ ------- --- ------- --
        -----------
      - ----- ----- -
        -- --------------------- ------- --- ------ --
        -----------
      -
    ---
  -
  ------ --------
--
展开代码

实现 Promise.catch() 方法

Promise 的示例代码

下面这个例子可以帮助你更好地理解 Promise 的实现方法:

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

----------------------------------------
------------------- -
  ------------------ ------- -- -------------
  -------------------------------
--
---------------------- -
  -------------------- ------- ------- ----- -------- - - ---------------
---
展开代码

输出结果为:

以上代码实现了使用 Promise 的方式加载图片,并在加载完成后将其添加到页面中。如果加载过程中出现错误,则输出错误信息。

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

纠错
反馈

纠错反馈