promise 的状态机通过 pending、fulfilled、rejected 三态单向不可逆流转实现异步控制;仅 pending 时 resolve/reject 生效,then/catch 注册回调并返回新 promise,错误自动冒泡直至被捕获。

Promise 的状态机管理是其核心机制,本质是通过三个互斥且不可逆的状态(pending、fulfilled、rejected)来约束异步操作的生命周期。它不靠外部轮询或定时器,而是靠内部状态标记 + 一次性回调触发来实现确定性流转。
状态只能单向流转,且不可重置
Promise 实例一旦从 pending 进入 fulfilled 或 rejected,状态就永久锁定。后续任何 resolve 或 reject 调用都会被忽略。这是靠内部标志位(如 state 字段)和守卫逻辑实现的:
- 构造函数中初始化
state = 'pending',并保存value/reason -
resolve(value)只在state === 'pending'时才更新状态为'fulfilled'并存值 -
reject(reason)同理,只对 pending 状态生效
then/catch 不改变自身状态,只注册响应行为
then 和 catch 返回的是新 Promise,而非修改原实例。它们的作用是:根据当前 Promise 的状态,把回调加入对应队列(onFulfilledQueue / onRejectedQueue),并在状态确定后按顺序执行。例如:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 若调用
then时 Promise 已 fulfilled,则立即异步调度(微任务)执行该回调 - 若仍为 pending,则暂存回调,等未来 resolve/reject 触发时再统一派发
-
catch本质是then(undefined, onRejected),只监听 rejected 分支
链式调用靠返回新 Promise 实现状态接力
每个 then 回调的返回值会作为下一个 Promise 的输入,从而形成状态传递链:
- 返回普通值 → 下一个 Promise 以
resolve(值)立即进入 fulfilled - 返回 Promise → 下一个 Promise 等待该 Promise settle 后,继承其结果
- 抛出异常 → 下一个 Promise 以
reject(错误)进入 rejected
这种设计让“状态流”始终可控,避免了回调地狱中状态混乱的问题。
错误冒泡与拒绝捕获是状态机的关键安全机制
Promise 链中的错误会自动向下冒泡,直到遇到 catch 或最后一个 then 的失败回调。这依赖状态机的“未处理拒绝”追踪:
- 每个 Promise 实例记录是否有 .catch 或 then 的第二个参数监听 rejection
- 若状态变为 rejected 且无人监听,环境(如 Chrome)会在微任务队列清空后触发
unhandledrejection事件 - 一旦被
catch捕获,状态转为 fulfilled(返回值作为新 Promise 的 resolve 值),错误流中断
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










