首页 > 网页制作 >Promise核心状态变化过程如何实现

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

来源:互联网 2026-07-16 07:07:12

Promise实例初始为pending状态,通过resolve或reject触发单向不可逆转换至fulfilled或rejected。状态变更具有原子性,先判后改,避免竞态。状态锁定后触发对应回调队列,通过微任务调度异步执行,执行器同步运行确保状态可控。

要深入理解 Promise 的执行机制,必须从其底层状态机模型入手。其核心规律可概括为单向且不可逆的状态流转。掌握 Promise 的关键,在于熟悉这套状态变化规则。

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

长期稳定更新的攒劲资源: >>>点此立即查看<<<

Promise 实例在创建时即处于三种状态之一:pending(待定)fulfilled(已成功)rejected(已失败)。状态转换由执行器(executor)中显式调用的 resolvereject 函数触发。一旦状态确定,便无法再更改。

状态只有三种,且严格遵循单向规则

每个 Promise 实例始终只处于以下一种状态:

  • pending:初始状态,既未成功也未失败,允许改变
  • fulfilled:成功状态,由 resolve(value) 触发,之后状态锁定,不可再变
  • rejected:失败状态,由 reject(reason) 触发,同样不可再变

状态转换路径只有一条:pending → fulfilledpending → rejected。一旦进入后两者,后续的 resolvereject 调用均被忽略。这正是“不可逆”的直观体现。

状态变更的原子性控制

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

  • 若当前状态不是 pending,直接返回,不执行任何操作
  • 若当前状态是 pending,则更新 this.state,并保存 this.valuethis.reason

这种“先判断后修改”的原子性逻辑,确保状态变更不会被重复或覆盖,从而避免竞态问题。换句话说,谁先调用 resolvereject,谁就决定了最终结果,后续调用均无影响。

状态改变后触发对应回调

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

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

这里有一个关键细节:这些回调通过 queueMicrotask(微任务)调度,会在当前同步代码执行完毕后、下一个宏任务之前执行。这正是 Promise 实现“异步但不延迟”的底层机制——注册的回调不会立即执行,但也不会被推迟到遥远的定时器里。

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

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

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

这种设计让 Promise 的状态起点非常清晰,过程完全可预测。正是基于这套稳固的状态机模型,链式调用和错误冒泡才能顺畅地运行。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。