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

被catch()处理的Promise返回值是什么?无返回时后续then为何仍执行

JS Promise 链式调用疑问解答

运行逻辑说明

  • 所有 Promise 实例的 .then()、.catch() 方法执行后,都会返回一个全新的 Promise 实例,不会复用原 Promise 对象
  • 当上游 Promise 触发 rejected 状态时,会被最近的下游 .catch() 捕获。只要该 .catch() 内部没有主动抛出新错误,也没有返回 Promise.reject() 类型的结果,.catch() 返回的新 Promise 就会默认变为 fulfilled(已完成)状态,后续绑定的 .then() 回调就会正常触发。

你观察到的现象原因

你代码中 .catch() 内部没有显式写 return 语句,JS 里无 return 语句的函数执行结束后默认返回 undefined,因此:

  1. initialCheck() 最终返回的是 .catch() 产出的 fulfilled 状态 Promise
  2. 后续 .then(r => {actualStuff()}) 的入参 r 接收到的就是 undefined
  3. 所以 actualStuff() 会正常执行,控制台打印 hello 完全符合 Promise 规范。

拓展实现(异常时不执行后续逻辑)

如果你希望端点访问失败时跳过 actualStuff() 的执行,只需要在 .catch() 中抛出错误或者返回 rejected 状态的 Promise 即可,示例如下:

const initialCheck = () => {
  return fetch('https://thissitedoesnotexistihopeatleast')
    .then(r => {
      // 端点可用时的逻辑
      return r
    })
    .catch(err => {
      // 端点不可用时的逻辑
      throw new Error('端点访问失败')
      // 也可以写 return Promise.reject(err)
    })
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 07:09:00