Promise状态流转为单向不可逆:pending是唯一起点,只能转为fulfilled(由resolve触发)或rejected(由reject或未捕获异常触发),二者互不转换且不可退回pending。

Promise 的三种状态流转是一条单向、不可逆的路径:从 pending 出发,只能转向 fulfilled 或 rejected 中的一个,且一旦转换就再也无法更改。
初始状态一定是 pending
只要 new Promise() 执行,内部状态立刻进入 pending。此时 Promise 还没得到结果,既不算成功也不算失败,就像订单已提交、还在配送中。
- 这个状态是 Promise 的唯一起点,没有其他入口
- 控制台打印新创建的 Promise,显示为
Promise { <pending> } - 即使 executor 函数同步抛错(比如直接 throw),也会立即触发 reject,跳过 pending 的停留
pending → fulfilled:靠 resolve 触发
当 executor 内部调用 resolve(value),状态就锁定为 fulfilled,并把 value 作为终值保存下来。
- value 可以是任意类型(字符串、对象、另一个 Promise)
- 多次调用 resolve 不会改变状态或覆盖值,后续调用被忽略
- fulfilled 状态下,所有已注册的
.then(onFulfilled)回调会被依次执行
pending → rejected:靠 reject 触发
当 executor 内部调用 reject(reason),状态就锁定为 rejected,并把 reason(通常是 Error 实例)作为拒绝原因保存。
- reason 推荐传 Error 对象,便于调试和堆栈追踪
- executor 中未捕获的异常(如语法错误、引用 undefined)也会隐式触发 reject
- rejected 状态下,所有已注册的
.catch(onRejected)或.then(null, onRejected)会被触发
状态不可逆是核心约束
fulfilled 和 rejected 是终点态,它们之间不能互相转换,也不能退回 pending。
- 哪怕在 resolve 后再调 reject,或反过来,都不会生效
- 这种设计避免了状态歧义,让异步结果可预测、可追溯
- 这也是为什么 Promise 链中错误不会“自动恢复”——状态锁死,后续 then 不会重新走成功分支


















