原生 promise 无 .status 属性,需通过回调执行时机判断状态:onfulfilled 立即执行为 fulfilled,onrejected 立即执行为 rejected,均未触发则大概率 pending;已 settled 的 promise 多次调用 then/catch 会立即返回缓存结果。

JavaScript 原生 Promise 实例没有公开的 .status 属性,无法直接读取当前状态。但你可以通过行为特征、回调触发逻辑和辅助手段来可靠判断它处于 pending、fulfilled 还是 rejected 状态。
利用 then/catch 的执行时机判断
这是最常用也最符合 Promise 设计意图的方式:状态决定了哪个回调会被调用。
- 如果
.then(onFulfilled)中的onFulfilled立即执行(微任务队列中同步触发),说明 Promise 已是 fulfilled - 如果
.catch(onRejected)立即执行,说明 Promise 已是 rejected - 如果两个回调都未立即触发,且后续也未被调用(比如加了延时检查),大概率仍是 pending —— 但要注意,pending 不代表“永远不结束”,只是尚未 settled
- 注意:只传一个参数的
.then(fn)不会捕获 rejected;必须用.catch或.then(null, fn)才能观察 rejected 状态
借助已 settled Promise 的复用特性
fulfilled 和 rejected 状态一旦确立,结果就会被缓存并重复提供。这是识别 settled 的关键信号:
- 对同一个已 resolve 的 Promise 多次调用
.then(cb),每次cb都会立刻以相同值执行 - 对同一个已 reject 的 Promise 多次调用
.catch(cb),每次cb都会立刻收到同一个 error 实例 - 而 pending Promise 的
.then回调永远不会“立刻”执行,总要等异步完成
使用包装类或调试辅助手段
生产环境不建议暴露状态,但在开发、测试或自定义实现中可主动增强可观测性:
- 自己实现简易 Promise 类时,可在内部维护
this.status = 'pending',并在 resolve/reject 时更新,再提供getStatus()方法 - 浏览器 DevTools 中,在 Promise 创建后打个断点,配合
console.log(promise)查看控制台展开信息(部分环境会显示内部状态,但非标准行为) - 用
Promise.race([promise, new Promise(() => {})])无法直接检测,但可结合超时逻辑做“是否已 settled”的粗略判断(不推荐用于精确状态识别)
明确哪些方式不可靠
避免踩坑,以下常见做法不能准确反映 Promise 状态:
-
promise.status === 'fulfilled'—— 原生 Promise 没有该属性,会返回undefined - 仅凭
typeof promise.then === 'function'判断 —— 所有 Promise 实例都有then,这只能确认它是 thenable,不能说明状态 - 试图用
try/catch包裹promise.then来捕获 pending 期错误 —— 错误只在 handler 内部抛出才被捕获,不反映 Promise 自身状态 - 检查
promise.constructor === Promise—— 只能判断类型,与状态无关











