最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Promise 的核心状态变化过程是如何实现的
时间:2026-07-15 20:34:04 编辑:袖梨 来源:一聚教程网
Promise 的核心是单向不可逆状态机,仅含 pending、fulfilled、rejected 三种状态,pending 可转后两者但不可逆;状态变更通过 resolve/reject 触发,遵循“先判后改”原子逻辑;状态变更后以微任务执行对应回调队列。
Promise 的核心状态变化过程靠的是单向、不可逆的状态机,配合执行器(executor)中显式调用的 resolve 或 reject 函数来触发。
状态只有三种且严格单向
Promise 实例始终处于以下其一状态:
- pending:初始态,既没成功也没失败,可被改变
-
fulfilled:成功态,由
resolve(value)触发,之后不能再变 -
rejected:失败态,由
reject(reason)触发,之后也不能再变
状态转换路径唯一:pending → fulfilled 或 pending → rejected。一旦进入后两者,任何后续调用 resolve 或 reject 都会被忽略。
状态变更的原子性控制
每次调用 resolve 或 reject 时,都会先检查当前状态是否仍是 pending:
- 如果不是
pending,直接返回,不做任何操作 - 如果是
pending,才更新this.state,并保存this.value或this.reason
这种“先判后改”的逻辑,保证了状态变更不会被重复或覆盖,也避免了竞态问题。
状态改变后触发对应回调
Promise 内部维护两个回调队列:onFulfilledCallbacks 和 onRejectedCallbacks。它们在 then 被调用时收集回调函数,并在状态真正改变后统一执行:
- 状态变为
fulfilled→ 遍历并执行所有成功回调,传入this.value - 状态变为
rejected→ 遍历并执行所有失败回调,传入this.reason
注意:这些回调是通过 queueMicrotask(微任务)调度的,确保它们在当前同步代码结束后、下一个宏任务前执行,这是 Promise “异步但非延迟”的关键。
执行器立即运行,状态即刻可控
new Promise 时,传入的 executor 函数会同步立即执行,也就是说,resolve 或 reject 的调用时机完全由你控制:
- 可以立刻 resolve,创建一个已成功的 Promise
- 可以 setTimeout 后 reject,模拟异步失败
- 也可以抛出错误,自动触发 reject
这种设计让 Promise 的状态起点清晰、过程可预测,为链式调用和错误冒泡打下基础。
相关文章
- 代号鸢港服官网最新链接入口-官网港服入口地址一览 07-17
- jm漫画-官方网页版入口 07-17
- 《和平精英》上帝模式怎么开启-第一人称视角切换指南 07-17
- 新福建app商城积分怎么兑换 07-17
- 钉钉AI做邮件润色怎样运用参考资料 07-17
- Vegas如何制作打字机字幕效果 07-17