为何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失败,后续代码依然能执行,有两种常见方式:
用
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') }给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
相关产品推荐
相关产品推荐

