一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Promise 的核心状态变化过程是如何实现的

时间:2026-07-15 20:34:04 编辑:袖梨 来源:一聚教程网

Promise 的核心是单向不可逆状态机,仅含 pending、fulfilled、rejected 三种状态,pending 可转后两者但不可逆;状态变更通过 resolve/reject 触发,遵循“先判后改”原子逻辑;状态变更后以微任务执行对应回调队列。

Promise 的核心状态变化过程靠的是单向、不可逆的状态机,配合执行器(executor)中显式调用的 resolvereject 函数来触发。

状态只有三种且严格单向

Promise 实例始终处于以下其一状态:

  • pending:初始态,既没成功也没失败,可被改变
  • fulfilled:成功态,由 resolve(value) 触发,之后不能再变
  • rejected:失败态,由 reject(reason) 触发,之后也不能再变

状态转换路径唯一:pending → fulfilledpending → rejected。一旦进入后两者,任何后续调用 resolvereject 都会被忽略。

状态变更的原子性控制

每次调用 resolvereject 时,都会先检查当前状态是否仍是 pending

  • 如果不是 pending,直接返回,不做任何操作
  • 如果是 pending,才更新 this.state,并保存 this.valuethis.reason

这种“先判后改”的逻辑,保证了状态变更不会被重复或覆盖,也避免了竞态问题。

状态改变后触发对应回调

Promise 内部维护两个回调队列:onFulfilledCallbacksonRejectedCallbacks。它们在 then 被调用时收集回调函数,并在状态真正改变后统一执行:

  • 状态变为 fulfilled → 遍历并执行所有成功回调,传入 this.value
  • 状态变为 rejected → 遍历并执行所有失败回调,传入 this.reason

注意:这些回调是通过 queueMicrotask(微任务)调度的,确保它们在当前同步代码结束后、下一个宏任务前执行,这是 Promise “异步但非延迟”的关键。

执行器立即运行,状态即刻可控

new Promise 时,传入的 executor 函数会同步立即执行,也就是说,resolvereject 的调用时机完全由你控制:

  • 可以立刻 resolve,创建一个已成功的 Promise
  • 可以 setTimeout 后 reject,模拟异步失败
  • 也可以抛出错误,自动触发 reject

这种设计让 Promise 的状态起点清晰、过程可预测,为链式调用和错误冒泡打下基础。

热门栏目