手写 Promise 的核心是准确模拟 pending/fulfilled/rejected 三种不可逆状态,then 回调必须通过 queueMicrotask 等微任务异步执行,返回新 Promise 并正确处理值穿透与错误传递。

手写 Promise 的核心在于准确模拟三种状态(pending、fulfilled、rejected)的不可逆转换,以及确保 then 回调按规范进入微任务队列(如使用 queueMicrotask 或 Promise.resolve().then),而非立即执行或降级为宏任务。
状态管理:用私有变量 + 不可逆约束
Promise 内部必须维护一个 state 和一个 value(或 reason)。关键点是:
- 初始状态为
pending,只能通过resolve或reject一次转为fulfilled或rejected - 一旦状态改变,后续所有
resolve/reject调用必须被忽略(不报错,也不生效) - 不能暴露
state给外部读取,仅用于内部判断逻辑
then 方法:返回新 Promise + 分离注册与执行
then(onFulfilled, onRejected) 必须返回一个新的 Promise,且两个回调都应异步执行(即使 Promise 已 settled)。实现分两步:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
-
注册阶段:当当前 Promise 还是
pending,把onFulfilled/onRejected存入队列(如this.onFulfilledCbs) -
执行阶段:当状态变为
fulfilled或rejected,用queueMicrotask包裹所有对应回调,并逐个执行;每个回调的返回值需作为新 Promise 的 resolve 值(遵循 Promise A+ 链式穿透规则)
微任务调度:必须用 queueMicrotask 或等效方案
规范要求 then 回调必须在当前任务结束后、下一个宏任务前执行。不能用 setTimeout(宏任务),也不能同步调用(破坏异步性)。推荐方式:
立即学习“Java免费学习笔记(深入)”;
- 首选
queueMicrotask(callback)—— 语义清晰、性能好、现代环境支持良好 - 兼容写法:
Promise.resolve().then(callback),本质是借原生 Promise 的微任务机制 - 避免
process.nextTick(Node.js 专属)或MutationObserver(过于复杂)
错误处理与值穿透:保证链式健壮性
手写时容易忽略两点:
- 如果
onFulfilled或onRejected抛错,应以该错误reject新 Promise(即错误沿链向下传递) - 如果回调未提供(如
promise.then().then(...)),要默认透传上一环节的 value/reason,不能丢失值 - 对回调返回值做“Promise 解析过程”(thenable 判断 + 递归展开),这是实现
return new Promise(...)链式的关键

















