简易版 promise 需实现 pending/fulfilled/rejected 三种不可逆状态,构造时初始化为 pending 并维护回调队列;resolve/reject 通过微任务异步执行回调并处理值穿透与错误冒泡;then 返回新 promise 实现链式调用,catch 等价于 then(null, onrejected)。

要实现一个简易版的 Promise,核心在于准确模拟其三种内部状态(pending、fulfilled、rejected)及不可逆的状态转换规则——状态只能从 pending 变为 fulfilled 或 rejected,且一旦改变就不再变更。
状态定义与初始化
Promise 实例创建时必须处于 pending 状态,并保存成功值(value)或失败原因(reason),初始为空。同时需维护两个回调队列:onFulfilledCallbacks 和 onRejectedCallbacks,用于暂存尚未执行的 then 回调。
- 构造函数接收一个执行器函数
executor,立即同步调用它,并传入resolve和reject两个函数 -
resolve和reject是闭包内定义的私有函数,仅在 executor 中可用 - 状态变更前需检查当前是否仍为
pending,否则直接忽略后续调用(保证状态不可逆)
resolve 与 reject 的状态更新逻辑
当调用 resolve(value) 时,若状态是 pending,则将其设为 fulfilled,记录 value,并异步执行所有已注册的 onFulfilledCallbacks;reject(reason) 同理,但触发 onRejectedCallbacks。
- 使用
setTimeout(..., 0)或queueMicrotask实现微任务调度,确保回调在当前同步代码结束后、下次事件循环前执行 - 回调执行时需捕获异常:若某个
onFulfilled抛错,应将下一个 Promise(由该then返回)置为rejected - 注意:
resolve可接收另一个 Promise(即“穿透”逻辑),此时需递归等待其终态,而非直接设为 fulfilled
then 方法的链式与透传处理
then(onFulfilled, onRejected) 必须返回一个新 Promise,实现链式调用。无论上一个 Promise 处于何种状态,只要对应回调存在,就将其加入队列;若状态已定,则立即异步调度执行。
- 若当前 Promise 已
fulfilled,把onFulfilled推入微任务队列;已rejected则推onRejected - 若仍在
pending,则暂存回调到对应数组中,待未来状态变更时统一触发 - 回调的返回值决定下一个 Promise 的状态:返回普通值 →
resolve下一个;抛错 →reject下一个;返回 Promise → 等待其结果并继承状态
错误冒泡与 catch 的本质
catch(onRejected) 本质上是 then(null, onRejected) 的语法糖。未被处理的错误会沿 Promise 链向后传递,直到遇到第一个 onRejected 回调或最终被全局 unhandledrejection 捕获。
- 每个
then内部都应包裹回调执行逻辑,并在出错时调用新 Promise 的reject - 即使前序 Promise 是 rejected,只要当前
then提供了onRejected,就不会触发后续的catch - 不提供
onRejected的then会原样透传 rejection,这是错误冒泡的基础











