promise 通过观察者模式实现状态变更通知:状态确定后立即同步执行已注册回调,采用微任务队列保证执行顺序与时机,传递标准化参数解耦观察者,错误自动向下游传播。

Promise 状态变更后通知观察者,本质是通过内置的观察者模式实现的:状态一旦从 pending 转为 fulfilled 或 rejected,就立即遍历并触发所有已注册的回调函数(即观察者),且保证只触发一次、不可逆、线程安全。
状态确定即触发,不等后续注册
Promise 的观察者(then / catch 回调)在状态已终结时注册,也会被**立即同步执行**。例如:
- 一个 Promise 已 resolve,之后再调用
.then(cb),cb会立刻以微任务(microtask)方式执行; - Hydra 等实现中,注册时若状态非 pending,会直接调用
observer.call(state)并清空观察者列表,防止重复触发和内存泄漏。
通知机制靠“队列+微任务”保障顺序与时机
浏览器或运行时环境将回调统一推入 PromiseJobs 队列(属于 microtask),确保:
- 所有
then回调按注册顺序排队,不被宏任务(如setTimeout)打断; - 同一轮事件循环中,多个 Promise 状态变更的回调会按触发先后合并执行;
- 即使在
resolve()后立刻注册then,回调也总在当前同步代码结束后、下一轮宏任务前执行。
观察者接收的是封装后的结果,不是原始主题
Promise 不暴露内部状态对象给观察者,而是传递标准化数据:
-
fulfilled时传入value(决议值); -
rejected时传入reason(拒绝原因,通常是 Error 实例); - 观察者无需访问 Promise 实例本身,只需处理传入参数——这正是解耦的关键:不知道谁发的通知,只关心“发生了什么”。
错误传播自动向下游转发
当某个 then 回调抛出异常,或返回一个被 reject 的 Promise,该错误不会终止链路,而是自动转为下一个 catch 或 then 的第二个参数的输入:
- 这相当于在观察者内部发生新状态变更,触发了“下游观察者”的更新;
- 因此
.catch()实质是注册了一个专用于rejected状态的观察者,且能捕获链路上任意环节抛出的错误。











