JavaScript Promise的catch块不生效?await串行执行触发未处理拒绝报错如何解决
问题原因
- 核心错误是你把
allowedArea、validSubscription定义成了直接执行的Promise实例,而非返回Promise的函数:- 代码加载时这两个Promise就会立刻执行并reject,此时没有任何catch捕获这个异常,直接触发
UnhandledPromiseRejection报错 - 你在
claimCheck里写的是await allowedArea(),把Promise实例当成函数调用,会触发额外的调用异常
- 代码加载时这两个Promise就会立刻执行并reject,此时没有任何catch捕获这个异常,直接触发
- 路由逻辑里的判断写错了,
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
相关产品推荐
相关产品推荐

