手写 Promise 的实现方式

阅读时长 5 分钟读完

Promise 是一种异步编程的解决方案,它解决了回调地狱、异步操作顺序控制、错误冒泡等问题,已成为现代前端开发中不可或缺的一部分。

本文将介绍如何手写一个符合 Promise/A+ 规范的 Promise,从一个简单的示例开始,逐步深入,带你理解 Promise 的实现细节和使用场景。

示例代码

先上一个最基础的 Promise 示例代码,我们将在此基础上进行逐步优化:

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

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

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

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

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

代码解释如下:

  • 构造函数:接收一个函数参数,该函数会立即执行,在该函数中调用 resolve 或 reject 方法来改变 Promise 的执行状态。
  • resolve 和 reject 方法:分别用于将 Promise 的状态改为“fulfilled”或“rejected”,并设定 Promise 的结果。
  • then 方法:用于注册回调函数,并返回一个新的 Promise 实例。如果当前 Promise 的状态已经改变,则直接执行回调,并返回新 Promise 的执行结果。

Promise 状态转换

在 Promise 中,有三种状态:

  • pending:等待中,既不是成功,也不是失败的状态。
  • fulfilled:成功状态,表示 Promise 执行成功。
  • rejected:失败状态,表示 Promise 执行失败。

一个 Promise 只能从 pending 状态转换为 fulfilled 或 rejected 状态,一旦状态发生改变,就不可逆转。Promise 状态发生改变后,就会执行回调函数。

Promise 的 then 方法

then 方法接收两个参数:第一个参数是成功时的回调函数,第二个参数是失败时的回调函数,它们分别对应 resolve 和 reject 方法。若只传递一个参数,则无论 Promise 执行成功或失败,均会执行回调。

then 方法返回一个新的 Promise 实例,这是异步操作完成后的执行结果。如果回调函数中返回的是一个 Promise,则新的 Promise 会等待该 Promise 的状态变更后继续执行。如果回调函数中抛出了一个错误,则新的 Promise 状态变成 rejected,并返回该错误。

实现细节

  • 使用回调队列来保存 then 传递的回调函数。
  • 确保 then 回调函数的执行顺序。
  • then 方法应该返回一个新的 Promise。
  • then 方法需要支持链式调用。
  • 如果回调函数中抛出了错误,应该将新 Promise 的状态改为 rejected。

总结

通过本文的学习,你已经掌握了如何手写一个符合 Promise/A+ 规范的 Promise,知道了 Promise 的状态转换及 then 方法的实现细节,希望能为你在实际项目开发中提供一些思路和指导。

示例代码仅仅是一个简单的实现,Promise 还有很多需要完善的地方,比如异步操作可能包括定时器、网络请求、文件读写等,可根据实际情况进行改进。祝你使用愉快!

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

纠错
反馈