登录
首页 >  文章 >  前端

Promise的三种状态及转换流程解析

时间:2026-04-01 08:27:21 107浏览 收藏

Promise的核心在于其三种不可逆的状态——pending(等待)、fulfilled(成功)和rejected(失败),它们构成了一次性异步操作的确定性模型:初始为pending,仅能由resolve或reject单向切换至fulfilled或rejected,且状态一旦确立便永远锁定;这种“一锤定音”的设计不仅避免了状态混乱,更深刻体现了Promise对异步结果终局性的承诺——理解它,就掌握了正确使用.then()、.catch()以及规避常见陷阱(如误判可重试性)的关键。

JavaScript中Promise对象的三个状态及其转换逻辑

Promise对象有三个状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。状态一旦改变,就不可逆——只能从 pending 转为 fulfilled 或 rejected,且后续不会再变。

pending:初始等待状态

创建 Promise 实例时,默认处于 pending 状态。此时异步操作尚未完成,既没成功也没失败。

常见情况包括:定时器未到、网络请求未返回、文件读取未结束等。

  • 不能直接通过代码手动进入或退出 pending 状态
  • 只有内部执行器(executor)中的 resolve() 或 reject() 调用才能触发状态变更
  • 此时 .then() 和 .catch() 的回调都不会立即执行

fulfilled:操作成功完成

当 executor 中调用 resolve(value) 时,Promise 状态变为 fulfilled,并携带一个值(value)。

该值会作为第一个 .then() 回调函数的参数传入。

  • resolve() 只接受一个参数,多传会被忽略
  • 如果传入的是另一个 Promise,当前 Promise 会等待它完成,再继承其状态和结果
  • 一旦变为 fulfilled,所有后续注册的 .then() 都会按顺序执行(微任务队列)

rejected:操作执行失败

当 executor 中调用 reject(reason) 或抛出未捕获异常时,Promise 状态变为 rejected,并携带一个拒绝原因(reason),通常是 Error 实例。

该原因会作为 .catch() 或 .then(null, onRejected) 的参数传入。

  • reject() 同样只接收一个参数
  • 未被 catch 捕获的 rejected Promise 会在控制台报错(Uncaught (in promise))
  • 即使之后补上 .catch(),状态也不会从 rejected 变回 pending 或 fulfilled

状态转换是单向且不可撤销的,设计初衷就是表达“一次性异步结果”。理解这点,就能避免误以为可以重试或重置 Promise 状态。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>