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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:18:04