promise状态一旦改变便不可逆,仅首次resolve或reject生效,后续调用被静默忽略;若executor中未调用二者,promise将永久pending。

因为 Promise 的状态只能改变一次,一旦从 pending 变为 fulfilled 或 rejected,后续任何对 resolve 或 reject 的调用都会被静默忽略。
Promise 是一个严格的状态机
每个 Promise 实例内部维护两个关键属性:
-
state:初始为
"pending",之后只能变为"fulfilled"或"rejected",不可逆、不可重置 - result:仅在状态变更时被赋值一次,后续赋值不生效
JavaScript 引擎在执行器(executor)中调用 resolve() 或 reject() 时,会先检查当前 state。若已不是 "pending",就直接跳过,不报错也不更新。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
常见被忽略的场景举例
以下代码中,第二次调用均无效:
- 同步重复调用:
resolve(1); resolve(2);→ 只有1生效 - 异步延迟调用:
setTimeout(() => resolve(2), 1000); resolve(1);→1先触发状态变更,2被丢弃 - 混用 resolve 和 reject:
resolve("ok"); reject(new Error());→"ok"生效,错误被忽略
不调用 resolve/reject 会怎样?
如果 executor 中既没调用 resolve 也没调用 reject,Promise 将永远卡在 "pending" 状态。所有 .then()、.catch() 回调都不会执行,也不会抛错——它只是“悬停”在那里,容易引发逻辑遗漏或超时问题。
如何避免误用?
- 确保 executor 中有且仅有一次终态调用(成功走
resolve,失败走reject) - 用
try/catch包裹可能抛错的同步逻辑,出错时显式reject - 异步操作中,避免多个定时器或回调都试图调用
resolve,可加标记位或用AbortController控制生命周期
这个设计不是 bug,而是 Promise 的核心契约:它代表一个**单一、不可变的异步结果**。重复承诺没有意义,引擎主动忽略,正是为了保证行为可预测。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










