为了账号安全,请及时绑定邮箱和手机立即绑定

有没有人遇到过这个问题哈!promise内部抛出错误,catch不到求指导!

有没有人遇到过这个问题哈!promise内部抛出错误,catch不到求指导!

侃侃无极 2019-08-05 23:18:37
阮一峰的ECMAScript6入门Promise对象第四小节提到:promise抛出一个错误,就被catch方法指定的回调函数捕获。constpromise=newPromise(function(resolve,reject){thrownewError('test');});promise.catch(function(error){console.log(error);});等同于://写法一constpromise=newPromise(function(resolve,reject){try{thrownewError('test');}catch(e){reject(e);}});promise.catch(function(error){console.log(error);});//写法二constpromise=newPromise(function(resolve,reject){reject(newError('test'));});promise.catch(function(error){console.log(error);});请问:为什么如下的形式,catch无法捕获错误constpromise=newPromise(function(resolve,reject){setTimeout(function(){thrownewError('test')},0)});promise.catch(function(error){console.log(error)});但如果改成如下两种形式就可以。//改写方法1constpromise=newPromise(function(resolve,reject){setTimeout(function(){try{thrownewError('test')}catch(e){reject(e)}},0)});//改写方法2constpromise=newPromise(function(resolve,reject){setTimeout(function(){reject(newError('test'));},0)});
查看完整描述

2 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

constpromise=newPromise(function(resolve,reject){
setTimeout(function(){thrownewError('test')},0)
});
promise.catch(function(error){console.log(error)});
JS事件循环列表有宏任务与微任务之分:setTimeOut是宏任务,promise是微任务,他们有各自的执行顺序;因此这段代码的执行是:
代码执行栈进入promise触发setTimeOut,此时setTimeOut回调函数加入宏任务队列
代码执行promise的catch方法(微任务队列)此时setTimeOut回调还没有执行
执行栈检查发现当前微任务队列执行完毕,开始执行宏任务队列
执行thrownewError('test')此时这个异常其实是在promise外部抛出的
constpromise=newPromise(function(resolve,reject){
setTimeout(function(){
try{
thrownewError('test')
}catch(e){
reject(e)
}
},0)
});
是因为你在setTimeOut主动触发了promise的reject方法,因此promise的catch将会在setTimeOut回调执行后的属于他的微任务队列中找到它然后执行,所以可以捕获错误
                            
查看完整回答
反对 回复 2019-08-05
  • 2 回答
  • 0 关注
  • 736 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信