promise 状态由内部机制自动单向流转:pending→fulfilled/rejected,不可逆、不可重置;.then/.catch 返回新 promise,状态取决于回调返回值或错误;原生不支持取消,需用 abortcontroller 等方案实现中断。

Promise 的状态流转不是靠手动管理,而是由其内部机制自动控制:一旦从 pending 变为 fulfilled 或 rejected,就不可逆、不可重置。
状态只能单向变化,且仅触发一次
Promise 构造函数执行时处于 pending 状态;调用 resolve() 后变为 fulfilled,调用 reject() 后变为 rejected。之后任何对 resolve/reject 的再次调用都无效。
- 即使多次调用 resolve,只有第一次生效,后续被忽略
- reject 同理,且不会因为之前 resolve 过就失效(二者互斥)
- 状态改变后,所有已注册的
.then()/.catch()回调会按顺序执行(微任务队列)
链式调用中每个 new Promise 都有独立状态
.then() 和 .catch() 返回的是**新 Promise**,它的状态取决于回调函数的返回值或抛出的错误,和上游 Promise 无关。
- 回调返回普通值 → 新 Promise 为 fulfilled
- 回调返回 Promise → 新 Promise 状态跟随该 Promise
- 回调抛出错误 → 新 Promise 为 rejected
避免“状态失控”的常见做法
实际开发中不直接操作 Promise 状态,而是通过封装逻辑来明确意图:
- 用
Promise.all()统一等待多个 Promise,任一失败则整体 rejected - 用
Promise.race()获取最先 settled 的结果(注意:fulfilled 或 rejected 都算) - 需要重试或降级时,用递归或循环生成新 Promise,而不是试图“重置”旧的
- 调试时可用
console.log在 resolve/reject 前加标识,确认触发时机
想“取消”或“中断”怎么办?
原生 Promise 不支持取消。若需中断,应:
- 在异步操作内部检查外部信号(如 AbortController 的 signal)
- 封装成可取消的 Promise 工厂函数,结合
throwIfAborted逻辑 - 使用第三方库如
p-cancelable,或现代方案如fetch(signal)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











