Promise 的实现原理和使用方法深度详解

阅读时长 4 分钟读完

什么是 Promise?

Promise 是一种处理异步操作的机制。在 JavaScript 中,异步操作常常是通过回调函数来实现的。回调函数是 JavaScript 中常见的一种异步操作方式,但是回调函数代码嵌套层数深,代码可读性差且难以维护。而 Promise 的出现使得异步操作的处理变得简单易懂。

Promise 是一种对象,它表示一个异步操作最终会返回一个结果。Promise 有三种状态:等待态、已完成态(fulfilled)和已拒绝态(rejected),一个 Promise 只能从等待态转换为其中的一种完成状态:

  • 等待态,表示 Promise 正在执行中,并未成功或失败;
  • 已完成态(fulfilled),表示 Promise 执行成功,并返回了一个值;
  • 已拒绝态(rejected),表示 Promise 执行失败(或出现错误),并返回拒绝的原因。

Promise 的实现原理

Promise 的实现原理是基于回调函数,利用事件循环机制。Promise 的实现主要依靠构造函数和原型方法来实现。

Promise 的构造函数接受一个函数参数,该函数参数被称为执行器函数,执行器函数接受两个函数参数 resolve 和 reject,这两个函数是 Promise 构造函数内置的,用于将 Promise 从等待态转换为已完成态或已拒绝态。

执行器函数中执行的异步操作代码通过 resolve 函数让 Promise 状态从等待态转换为已完成态,并返回异步操作结果;如果异步操作发生了错误,则通过 reject 函数让 Promise 状态从等待态转换为已拒绝态,并返回错误原因。

Promise 实例对象有一个 then 方法用于注册 Promise 状态转换后的回调函数。

如果 Promise 状态为已完成态,则直接执行 onFulfilled 函数;如果 Promise 状态为已拒绝态,则直接执行 onRejected 函数。

除了 then 方法,Promise 还有 catch、finally 等方法。

  • then 的一个参数是成功状态的回调,还有一个参数是失败时的回调,但是其实我们用 catch 来捕获失败原因更为简单。
  • finally 方法不接收任何的 resolve 或 reject 状态的参数函数,它在 promise 执行完毕后执行指定的回调函数。

Promise 的使用方法

下面我们通过代码来说明 Promise 的使用方法。

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

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

上面的代码中使用 AJAX 请求获取数据,通过 Promise 实例对象的 then 方法和 catch 方法,分别注册请求成功和请求失败后的回调函数。

总结

Promise 的出现使得异步操作的处理变得简单易懂,而不再依赖于回调函数的嵌套。Promise 基于构造函数和原型方法实现,利用事件循环机制处理异步操作,将异步操作的结果封装成 Promise 实例对象,并实现 Promise 状态的状态转换和状态变化处理,从而使 Promise 实例对象的 then 和 catch 等方法得以被调用并处理相应结果。

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

纠错
反馈