Promise实例初始为pending状态,通过resolve或reject触发单向不可逆转换至fulfilled或rejected。状态变更具有原子性,先判后改,避免竞态。状态锁定后触发对应回调队列,通过微任务调度异步执行,执行器同步运行确保状态可控。
要深入理解 Promise 的执行机制,必须从其底层状态机模型入手。其核心规律可概括为单向且不可逆的状态流转。掌握 Promise 的关键,在于熟悉这套状态变化规则。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
Promise 实例在创建时即处于三种状态之一:pending(待定)、fulfilled(已成功)或 rejected(已失败)。状态转换由执行器(executor)中显式调用的 resolve 或 reject 函数触发。一旦状态确定,便无法再更改。
每个 Promise 实例始终只处于以下一种状态:
resolve(value) 触发,之后状态锁定,不可再变reject(reason) 触发,同样不可再变状态转换路径只有一条:pending → fulfilled 或 pending → rejected。一旦进入后两者,后续的 resolve 或 reject 调用均被忽略。这正是“不可逆”的直观体现。
每次调用 resolve 或 reject 时,内部会先检查当前状态是否仍为 pending:
pending,直接返回,不执行任何操作pending,则更新 this.state,并保存 this.value 或 this.reason这种“先判断后修改”的原子性逻辑,确保状态变更不会被重复或覆盖,从而避免竞态问题。换句话说,谁先调用 resolve 或 reject,谁就决定了最终结果,后续调用均无影响。
Promise 内部维护了两个回调队列:onFulfilledCallbacks 和 onRejectedCallbacks。在 then 被调用时收集回调函数,待状态真正改变后统一执行:
fulfilled → 遍历并执行所有成功回调,传入 this.valuerejected → 遍历并执行所有失败回调,传入 this.reason这里有一个关键细节:这些回调通过 queueMicrotask(微任务)调度,会在当前同步代码执行完毕后、下一个宏任务之前执行。这正是 Promise 实现“异步但不延迟”的底层机制——注册的回调不会立即执行,但也不会被推迟到遥远的定时器里。
当 new Promise 时,传入的 executor 函数会同步立即执行。也就是说,resolve 或 reject 的调用时机完全由你掌控:
这种设计让 Promise 的状态起点非常清晰,过程完全可预测。正是基于这套稳固的状态机模型,链式调用和错误冒泡才能顺畅地运行。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述