Promise 有 pending、fulfilled、rejected 三种状态,仅能单向不可逆地从 pending 转为 fulfilled 或 rejected;pending 是唯一初始态,表示已启动但结果未知,fulfilled 和 rejected 合称 settled,一旦确立便永久锁定,由 executor 中 resolve/reject 或抛错触发,且后续调用无效。

JavaScript 中 Promise 有三种状态:pending(待定)、fulfilled(已兑现)和 rejected(已拒绝)。状态转变是单向且不可逆的——只能从 pending 开始,转向 fulfilled 或 rejected 之一,之后再无法更改。
三种状态的含义与初始状态
所有 Promise 实例一创建就处于 pending 状态,表示异步操作尚未完成,结果未知。它不是“未开始”,而是“已启动、待确认”。比如 fetch 请求发出但还没收到响应,或 setTimeout 还没触发,此时 Promise 就卡在 pending。
fulfilled 表示操作成功完成,由 executor 中调用 resolve(value) 触发,value 成为后续 .then() 的入参;rejected 表示操作失败,由 reject(reason) 或 executor 内抛出异常触发,reason 会被 .catch() 捕获。
fulfilled 和 rejected 合称 “settled(已确定)”状态,一旦进入,就永久锁定。
立即学习“Java免费学习笔记(深入)”;
状态如何发生不可逆转变
转变只发生在 Promise 构造函数执行器(executor)内部,且仅通过两个函数触发:
-
resolve(value)→ pending → fulfilled,value 被记为终值 -
reject(reason)→ pending → rejected,reason 被记为据因 - executor 执行中抛出未捕获错误 → 自动等价于调用 reject
关键规则是:状态变更具有原子性与排他性。例如:
- 先 resolve(1),再 reject('err') → 最终仍是 fulfilled,值为 1
- 连续调用 resolve(1)、resolve(2) → 只有第一次生效,后续被忽略
- fulfilled 后再调 resolve 或 reject → 完全无效,不报错也不改变状态
为什么设计成不可逆
这不是技术限制,而是为保障行为可预测而做的核心约束:
- 避免竞态问题:比如支付成功后,多个 .then() 不会重复提交订单
- 确保链式调用稳定:fetch().then(parse).then(render) 中,每个环节都拿到确定结果,不会中途“变卦”
- 简化错误处理:一旦 rejected,.catch() 就能稳稳接管,无需反复校验状态是否被篡改
注意:状态不可逆 ≠ 数据不可变。Promise 可以 resolve 一个对象,该对象自身属性仍可修改,只是 Promise 的状态和终值/据因不再变化。
怎么知道当前是什么状态
原生 Promise **不暴露 status 属性**,无法直接读取。但可通过行为间接判断:
- 刚创建、还没 resolve/reject → 调用 .then() 不立即执行,说明是 pending
- .then(onFulfilled) 立即执行,且传入值固定 → 大概率是 fulfilled
- .catch(onRejected) 立即执行,且 error 一致 → 大概率是 rejected
- 多次绑定 .then() 都拿到相同值 / 多次 .catch() 都拿到相同 error → 是 settled 状态的典型表现
开发调试时,可用 console.log 配合断点观察回调执行时机,或借助 DevTools 的 Promise 监控功能辅助识别。


















