You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套Promise返回意外输出:为何我的Promise状态为fulfilled?

为何我的Promise状态最终是fulfilled?

我明确Promise处理函数返回不同结果时的状态和结果规则:

  • 返回值:Promise以该值fulfilled
  • 无返回:Promise以undefined fulfilled
  • 抛出错误:Promise以该错误rejected
  • 返回已fulfilled的Promise:Promise以其值fulfilled
  • 返回已rejected的Promise:Promise以其值rejected
  • 返回pending的Promise:Promise处于pending,待其状态变更后同步变更

但运行以下代码后,test2的状态却是fulfilled,这是为什么?

const test = Promise.reject(new Promise((resolve, reject) => {
throw new Error("error")
}))

const test2 = test.catch((result) => {
result.catch(() => {
    throw new Error("error2");
})
})

console.log(test2);

控制台输出:

[[Prototype]]: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: undefined

问题分析

核心原因是外层catch回调没有返回值,触发了你列出的规则第2条:无返回的Promise处理函数会让Promise以undefined fulfilled。

具体拆解:

  1. test是一个被reject的Promise,它的reject值是另一个Promise(记为innerPromise)。innerPromise的执行器里直接抛出错误,所以它本身会被reject,原因是Error("error")。
  2. 当test.catch执行时,参数result就是这个innerPromise。你在回调里调用了result.catch(...),但没有把这个catch返回的Promise作为外层回调的返回值。
  3. 外层catch回调执行完后没有return任何内容,所以test2直接遵循规则,以undefined完成fulfilled状态。
  4. 你在result.catch里抛出的Error("error2")只会影响那个内层catch返回的Promise,和test2无关——因为你没把这个内层Promise返回给外层,test2不会等待它的状态变化,直接就完成了。

修正方案

如果想让test2因为error2变成rejected,只需把内层catch返回的Promise作为外层回调的返回值即可:

const test2 = test.catch((result) => {
  return result.catch(() => {
    throw new Error("error2");
  })
})

这样外层catch返回了一个Promise,当内层catch抛出错误时,这个返回的Promise会被reject,test2的状态就会同步变成rejected,结果为Error("error2")。


内容的提问来源于stack exchange,提问作者lome1446

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 16:22:52