手动实现简易Promise需支持三种状态、链式调用与值穿透:构造函数管理pending/fulfilled/rejected状态及回调队列;.then返回新Promise并兼容同步异步;.catch是.then(undefined, onRejected)语法糖;resolvePromise处理返回值解析,含微任务调度、循环引用检测等细节。

要手动实现一个支持 .then 与 .catch 链式调用的简易版 Promise,核心在于模拟原生 Promise 的三种状态(pending、fulfilled、rejected),并确保每次调用 .then 或 .catch 都返回一个新的 Promise 实例,从而支持链式调用和值穿透。
1. 基础结构与状态管理
Promise 构造函数接收一个执行器函数 executor,它立即执行,并传入 resolve 和 reject 两个回调。内部需维护当前状态(state)、成功值(value)或失败原因(reason),以及用于暂存异步回调的队列(onFulfilledCallbacks / onRejectedCallbacks)。
关键点:
- 初始状态为
pending,只能向fulfilled或rejected单向转变 -
resolve和reject必须是函数,且只在首次调用时生效(防止多次触发) - 若执行器中抛出异常,应自动调用
reject
2. 实现 .then 方法
.then(onFulfilled, onRejected) 必须返回一个新 Promise,这是链式调用的基础。无论当前 Promise 处于什么状态,都要兼容同步/异步场景:
- 若当前为
pending,把回调存入对应队列,等后续状态变更时统一执行 - 若已
fulfilled,立即异步执行onFulfilled(用queueMicrotask或Promise.resolve().then模拟微任务) - 若已
rejected,同理执行onRejected - 每个回调的返回值需作为下一个 Promise 的
resolve值;若回调抛错,则下一个 Promise 被reject
注意:onRejected 是可选的,未传时需透传错误(即默认行为是把 reason 向下 throw)。
3. 实现 .catch 方法
.catch(onRejected) 本质是 .then(undefined, onRejected) 的语法糖,只需内部委托给 .then 即可:
- 直接返回
this.then(undefined, onRejected) - 确保错误能被正确捕获并继续向下传递,不中断链路
这样就能支持 promise.then(...).catch(...) 或 promise.catch(...).then(...) 等任意组合。
4. 处理值穿透与 Promise 解析逻辑
当 .then 回调返回一个普通值(如字符串、数字)或另一个 Promise 时,必须按规范“解析”它:
- 若返回的是当前 Promise 实例(
return self),应抛出TypeError - 若返回的是其他 Promise(或具有
then方法的对象),需等待它完成,并以它的终值/原因决定下一个 Promise 的状态 - 若返回普通值,直接
resolve下一个 Promise
这部分逻辑封装为 resolvePromise(promise2, x, resolve, reject) 函数,是实现符合 Promises/A+ 规范的关键步骤。
不复杂但容易忽略:微任务调度、循环引用检测、错误边界处理、状态不可逆保证——这些细节共同决定了你的简易 Promise 是否真正可靠可用。

















