手写 promise 的核心是正确实现状态管理、then 方法的回调注册与执行、链式调用的返回值透传及错误捕获;需维护 pending/fulfilled/rejected 三种不可逆状态,then 返回新 promise 并依据回调返回值决定其状态,同时处理循环引用与微任务调度。

Promise 的核心是状态管理和异步任务的封装,手写时关键在于正确处理 pending/fulfilled/rejected 三种状态、then 方法的注册与回调执行时机、以及链式调用中返回值的透传与错误捕获。
一、基础结构:状态与构造函数
Promise 是一个类,接收一个执行器函数(executor),该函数立即执行,并传入 resolve 和 reject 两个函数。内部需维护 state、value 和 reason 三个关键字段:
- state 初始为 "pending",成功后变为 "fulfilled",失败后变为 "rejected"
- value 存储成功结果,reason 存储失败原因
- resolve 和 reject 需判断当前状态,确保状态只能改变一次(不可逆)
二、then 方法:注册回调与状态分离处理
then 接收 onFulfilled 和 onRejected 两个参数,默认为函数,需支持“穿透”(即不传时设为 x => x 和 err => { throw err })。它必须返回一个新的 Promise,以支持链式调用:
- 当当前 Promise 处于 pending 状态,将回调存入队列(如 this.onFulfilledCbs.push(onFulfilled))
- 当已 fulfilled,立即异步执行 onFulfilled(value),使用 queueMicrotask 或 Promise.resolve().then() 模拟微任务
- 当已 rejected,同理执行 onRejected(reason)
- 无论哪种情况,都要捕获回调执行异常,并 reject 新 Promise
三、链式调用:返回值规范与 Promise/A+ 兼容
then 返回的新 Promise 的状态,由 onFulfilled/onRejected 的返回值决定,这是链式调用的核心规则:
- 若返回值 x 是 Promise 实例,则新 Promise 状态跟随 x(即 resolve(x) 等价于 x.then(resolve, reject))
- 若 x 是普通值(包括 undefined、null、对象、函数等非 Promise),则新 Promise 立即 fulfilled(x)
- 若回调抛出异常,则新 Promise 立即 rejected(该异常)
- 需实现 resolvePromise 辅助函数,递归处理 x === promise 的循环引用问题(直接 reject TypeError)
四、补充方法:catch、finally 与静态方法
这些是语法糖,可基于 then 构建:
- catch(onRejected) 等价于 then(null, onRejected)
- finally(onFinally) 应无论成功失败都执行,且不改变原 Promise 结果;可用 then(onFinally, onFinally) 注册,再返回原 Promise(需保存原始 value/reason)
- Promise.resolve(value):若 value 是 Promise,直接返回;否则返回 fulfilled(value) 的新 Promise
- Promise.reject(reason):直接返回 rejected(reason) 的新 Promise
- Promise.all(iterable):并发执行所有 Promise,全成功才 fulfilled,任一失败则 rejected











