要实现支持链式调用的 Promise 类,核心是 then 方法返回新 Promise 并遵循 Promise/A+ 规范:状态不可逆、值穿透、微任务调度;resolvePromise 需防循环引用并确保 resolve/reject 仅调用一次。

要实现一个支持链式调用的 Promise 类,核心在于让 then 方法返回一个新的 Promise 实例,并正确传递异步结果和错误,同时遵循 Promise/A+ 规范的关键行为(如值穿透、状态不可逆、微任务调度等)。
理解链式调用的本质
链式调用依赖于每个 then 方法返回一个 Promise,使得后续 then 可以接在上一个 Promise 的 resolved/rejected 后续处理。这意味着:
-
then必须返回新 Promise,不能复用当前实例 - 回调执行结果(包括返回值或抛出错误)必须被“向下传递”给下一个 Promise
- 如果
then回调返回的是 Promise,则需等待其完成后再决定下一个 Promise 的状态 - 所有回调必须异步执行(使用
queueMicrotask或Promise.resolve().then模拟微任务)
基础结构与状态管理
Promise 实例需维护内部状态(pending / fulfilled / rejected)和对应值或原因。初始为 pending,只能单向变更:
- 构造函数接收 executor 函数,立即同步执行,并提供
resolve和reject两个函数 -
resolve(value):若 value 是 Promise,需递归展开;否则设为 fulfilled 状态 -
reject(reason):直接设为 rejected 状态 - 状态一旦改变,后续调用 resolve/reject 无效
实现 then 方法的细节逻辑
then(onFulfilled, onRejected) 需兼容多种输入并返回新 Promise:
- 参数默认为函数,若非函数则做“值穿透”(例如
onFulfilled = v => v) - 无论当前 Promise 处于什么状态,
then都应返回新 Promise,并把回调加入队列 - pending 时缓存回调;fulfilled/rejected 时异步调度对应回调
- 回调执行后:捕获异常 → reject 新 Promise;正常返回 → 用返回值 resolve 新 Promise(若返回 Promise 则展平)
关键辅助方法:resolvePromise
用于安全地处理 then 回调的返回值(尤其是嵌套 Promise),避免循环引用和多次调用:
- 检查是否为自身(
newPromise === x),是则以 TypeError 拒绝 - 检查
x是否为 Promise-like 对象(有then方法且为函数) - 调用
x.then,但只允许调用一次resolve或reject(用called标志位控制) - 确保所有调用都走微任务,保持时序一致性
不复杂但容易忽略:微任务调度、状态锁定、返回值展平、错误边界隔离——这些共同构成链式调用可靠性的基础。

















