如何解决Promise被reject时出现的UnhandledPromiseRejectionWarning报错
问题解答
报错原因
- 你遇到的是未处理的Promise拒绝警告,根本原因是
bookTable返回的Promise被标记为失败(reject)时,没有对应的代码捕获这个错误结果 - Promise语法规范要求所有失败状态必须被处理,当前Node.js版本仅给出警告,后续版本会直接以非零状态码终止进程
- 你搜索到的try/catch是与async/await语法配套的错误处理方式,若直接使用Promise实例,用
.catch()方法处理更直接。
优化写法
方案1:直接为Promise添加then/catch处理
你原有bookTable的核心逻辑无需修改,仅在调用时补充结果处理代码即可解决报错:
let bookedTimes = [1,2,4] const bookTable = (time) => { console.log(`我要预约${time}小时后的餐桌`) return new Promise(function(resolve,reject) { console.log('正在查询可预约桌位...') if(bookedTimes.includes(time)){ const error = `抱歉,${time}小时后没有可用桌位` setTimeout(() => { reject(error) }, 2000) } else { const success = `预约成功!你的桌位将在${time}小时后准备就绪` setTimeout(() => { resolve(success) }, 2000) } }) } // 调用时补充结果处理 bookTable(4) .then(successMsg => { // 处理预约成功逻辑 console.log(successMsg) }) .catch(errorMsg => { // 处理预约失败逻辑,添加这段即可消除警告 console.log(errorMsg) })
方案2:使用async/await + try/catch写法
如果你更习惯同步风格的代码,可以用async/await语法搭配try/catch处理错误,对应你搜索到的方案:
// 复用上面的bookTable函数 async function submitBooking(time) { try { const successMsg = await bookTable(time) console.log(successMsg) } catch (errorMsg) { // 所有await触发的Promise失败都会进入catch块 console.log(errorMsg) } } submitBooking(4)
额外优化建议
- 原代码中你在Promise内部的setTimeout里打印了结果日志,建议统一将结果输出放到then/catch或者try/catch块中,让Promise仅负责返回业务结果,职责更清晰
- 变量建议添加const/let声明,避免隐式声明为全局变量
内容的提问来源于stack exchange,提问作者Valortome
相关产品推荐
相关产品推荐

