一步一步手写 Promise

💡 原文中文,约12900字,阅读约需31分钟。
📝

内容提要

本文讲解如何根据 Promises/A+ 规范手写实现一个 Promise 类。Promise 代表异步操作结果,有 pending、fulfilled、rejected 三种状态。实现中定义了 MyPromise 类,包含状态、值、拒因及回调方法。then 方法用于注册回调并返回新 Promise,resolvePromise 方法处理 thenable 对象。通过 Promises/A+ 测试验证正确性,并优化类型判断以符合规范。

🎯

关键要点

  • 本文讲解如何根据 Promises/A+ 规范手写实现一个 Promise 类。

  • Promise 代表异步操作结果,有 pending、fulfilled、rejected 三种状态。

  • 实现中定义了 MyPromise 类,包含状态、值、拒因及回调方法。

  • then 方法用于注册回调并返回新 Promise,resolvePromise 方法处理 thenable 对象。

  • Promises/A+ 规范要求 promise 必须处于三种状态之一,且状态不可改变。

  • 构造函数中传入回调方法,负责将 promise 置为 fulfilled 或 rejected 状态。

  • 实现 fulfillPromise 和 rejectPromise 方法以修改 promise 状态。

  • then 方法接收两个可选参数,分别为 onFulfilled 和 onRejected。

  • then 方法可以被多次调用,且返回的新 promise 的值或拒因与当前 promise 相同。

  • resolvePromise 方法用于根据回调方法的返回值决议一个 promise。

  • thenable 是一个定义 then 方法的对象或函数,符合规范的 promise 需要支持 thenable。

  • 测试自定义的 Promise 可以使用 promises-aplus-tests 工具。

  • 修正构造 Promise 时调用 fulfillPromise 为 resolvePromise,以确保符合规范。

  • 最终实现的 Promise 完整符合 Promises/A+ 规范。

延伸问答

Promise 的状态有哪些?

Promise 有三种状态:pending(待定)、fulfilled(已满足)、rejected(被拒绝)。

如何手写一个符合 Promises/A+ 规范的 Promise 类?

可以定义一个 MyPromise 类,包含状态、值、拒因及回调方法,并实现 then 方法和状态修改方法。

then 方法的作用是什么?

then 方法用于注册回调函数,并返回一个新的 Promise,允许对异步操作的结果进行处理。

如何处理 thenable 对象?

resolvePromise 方法用于处理 thenable 对象,确保其符合规范并正确决议 Promise。

如何测试自定义的 Promise 实现?

可以使用 promises-aplus-tests 工具来测试自定义的 Promise,确保其符合规范。

Promise 的状态是否可以改变?

Promise 的状态只能从 pending 转换为 fulfilled 或 rejected,一旦改变后不可再修改。

➡️

继续阅读