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

JavaScript Promise的catch块不生效?await串行执行触发未处理拒绝报错如何解决

问题原因

  • 核心错误是你把allowedArea、validSubscription定义成了直接执行的Promise实例,而非返回Promise的函数:
    1. 代码加载时这两个Promise就会立刻执行并reject,此时没有任何catch捕获这个异常,直接触发UnhandledPromiseRejection报错
    2. 你在claimCheck里写的是await allowedArea(),把Promise实例当成函数调用,会触发额外的调用异常
  • 路由逻辑里的判断写错了,if (status.allowed = false)是赋值操作,不是相等判断,永远不会命中失败分支
  • reject不要求必须传Error对象,传自定义的业务对象是完全合法的用法

修复代码

首先把两个校验逻辑改成返回Promise的函数:

// 校验1:地区校验
const allowedArea = () => new Promise(function (resolve, reject) {
  console.log("CLAIM COORDS ALLOWED AREA CHECK")
  const allowed = false
  if (allowed === false) {
    reject({ allowed: false, reason: "Area blocked" })
    return // reject后加return避免执行后续逻辑
  }
  resolve()
})

// 校验2:订阅校验
const validSubscription = () => new Promise(function (resolve, reject) {
  const allowed = false
  if (allowed === false) {
    reject({ allowed: false, reason: "Bad Subscription" })
    return
  }
  resolve()
})

claimCheck逻辑不用修改,保持即可:

const claimCheck = async () => {
  try {
    // 串行执行校验,任意失败直接进catch
    await allowedArea() 
    await validSubscription() 
    return {allowed: true, reason: "PASS"}
  } catch (err) {
    console.log(err.reason) 
    return err
  }
}

修正路由里的判断逻辑,建议加兜底异常捕获:

router.post('api/address', async (req, res) => {
  try {
    const status = await claimCheck()
    // 把赋值操作改成相等判断
    if (status.allowed === false) { 
      // 失败场景处理逻辑
      res.status(400).send(status.reason)
    } else {
      // 成功场景处理逻辑
      res.send('校验通过')
    }
  } catch (e) {
    // 兜底异常处理,避免遗漏异常触发报错
    res.status(500).send('服务异常')
  }
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 16:45:03