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

为何JS中前置Promise拒绝会阻止后续Promise及代码执行?

为什么Promise拒绝后后续await代码不再执行?

这是个非常典型的异步错误处理问题,我来给你拆解清楚:

首先得明白async/await的本质——它其实是Promise的语法糖,把异步逻辑包装成了看起来像同步的写法。当你在async函数里用await等待一个Promise时:

  • 如果Promise被resolve,await会返回resolve的值,代码继续往下走;
  • 如果Promise被reject,await会直接抛出一个错误,就像你在同步代码里写了throw new Error('rej')一样。

回到你的代码里,kk函数里没有任何错误捕获的逻辑,当oo被reject时,await oo抛出的错误就成了未捕获的Promise rejection。JavaScript引擎遇到这种情况时,会立即中断当前async函数的执行流程,所以后面的await jj、console.log('async')自然就没有机会执行了。

怎么解决这个问题?

如果你希望即使oo失败,后续代码依然能执行,有两种常见方式:

  1. 用try/catch包裹异步操作
    这是最通用的错误处理方式,把可能出错的await代码放在try块里,用catch捕获错误:

    async function kk () {
      try {
        console.log(await oo)
      } catch (err) {
        console.error('oo执行失败:', err) // 这里可以处理错误,比如给个默认值或者提示
      }
      console.log(await jj)
      console.log('async')
    }
    
  2. 给Promise本身添加.catch()处理
    直接在oo后面链式调用.catch(),把rejection转化为resolved状态,这样await就能拿到处理后的值:

    async function kk () {
      // 用catch捕获oo的错误,返回一个默认值或者处理后的结果
      console.log(await oo.catch(err => 'oo失败了,用这个默认值代替'))
      console.log(await jj)
      console.log('async')
    }
    

另外要注意:现在不管是浏览器还是Node.js环境,未捕获的Promise rejection都会被标记为严重错误(浏览器控制台会红报错,Node.js甚至会终止进程),所以处理异步操作的错误是写JS异步代码时必须重视的环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:47:54