promise resolve后的报错,怎么捕获

new Promise(
    (r)=>{
        r("aaa")
        a
        console.log("resolve后的报错,怎么捕获")
        
    }

)

如上,a这个变量未定义,发现没捕获到
请问下,这种情况下,该怎么处理呢

回复
阅读 3.5k
5 个回答

一般来说,Promise中的resolve之后不应该再书写代码,但是如果写了的话还是会执行的。比如

new Promise((resolve, reject) => {
  resolve(1);
  console.log(2);
}).then(r => {
  console.log(r);
});
// 2
// 1

上面代码中,调用resolve(1)以后,后面的console.log(2)还是会执行,并且会首先打印出来。这是因为立即 resolved 的 Promise 是在本轮事件循环的末尾执行,总是晚于本轮循环的同步任务。
但是这种写法不是很好的语法规范,并且对于Promise,在resolve和reject之后的使命也就已经完成,后续的处理应该放在then和catch中处理,所以我们一般这样写

new Promise((resolve, reject) => {
  return resolve(1);
  // 后面的语句不会执行
  console.log(2);
}).then(r=>{
console.log(r)
})
//1
语法规范对于程序编写不可以忽视

这种行为属于未定义的行为,会怎么样完全取决于各家浏览器如何实现。

怎样避免未定义的行为?就是不!!要!!写!!

正常场景下,resolve之后不会再写代码了,你这完全是给自己挖坑。

新手上路,请多包涵

你是调用resolve修改的promise状态,如果是resolve之后的报错,是没有办法捕获的,promise内部已经try catch捕获了,所以不会抛出来。

你可以加个setTimeout(fn, 0)来resolve的状态修改改为异步执行,try catch 无法捕获异步的异常,就会抛出来。

Promise((resolve, reject) => {
   setTimeout(function() {
    resolve(123);
    a;
    console.log("这样就可以捕获到promise异常了")
   }, 0)
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏