promise状态转换仅由executor中resolve/reject触发,pending→fulfilled/rejected不可逆;.then/.catch返回新promise;async/await是promise语法糖。

JavaScript 异步编程中的状态转换,核心是围绕 Promise 的三种状态(pending、fulfilled、rejected)展开的,且一旦转换就不可逆。这种转换不是手动“设置”的,而是由 Promise 构造函数内部的执行器(executor)通过调用 resolve 或 reject 函数触发的。
Promise 状态由 executor 决定
创建 Promise 实例时,传入的 executor 函数会立即同步执行。它接收两个参数:resolve 和 reject,它们是状态转换的唯一合法入口:
-
resolve(value)→ 将 pending → fulfilled,并把value作为最终结果 -
reject(reason)→ 将 pending → rejected,并把reason作为拒绝原因 - executor 执行出错(如抛出异常)→ 自动等价于调用
reject
状态不可逆,也不可重入
Promise 规范明确规定:状态只能从 pending 转向 fulfilled 或 rejected,且一旦转换,后续再调用 resolve 或 reject 都会被忽略:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 多次调用
resolve(1),只有第一次生效;后续调用无效 -
resolve(1); reject('err');→ 最终状态仍是 fulfilled,值为 1 - 无法从 fulfilled 回退到 pending,也无法在 rejected 后再转 fulfilled
链式调用中产生新 Promise,而非改变原状态
.then() 和 .catch() 不修改原始 Promise 的状态,而是返回一个新的 Promise,其状态取决于回调函数的返回值或抛出情况:
- 回调返回普通值 → 新 Promise 变为 fulfilled,值为该返回值
- 回调返回另一个 Promise → 新 Promise 状态和值由该 Promise 决定
- 回调抛出错误 → 新 Promise 变为 rejected,原因即该错误
async/await 是语法糖,底层仍依赖 Promise 状态流转
async 函数总是返回 Promise,await 后面表达式的值决定了后续 Promise 的状态:
-
await 42→ 等价于Promise.resolve(42),后续变为 fulfilled -
await Promise.reject('fail')→ 后续 Promise 进入 rejected 状态 -
await遇到非 Promise 值,会自动包装成 fulfilled 状态的 Promise
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










