猿问

有大佬遇到过这个问题吗:promise内部抛出错误,catch不到怎么回事哈啊?

阮一峰的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)});
但如果改成如下两种形式就可以。
//改写方法1
constpromise=newPromise(function(resolve,reject){
setTimeout(function(){
try{
thrownewError('test')
}catch(e){
reject(e)
}
},0)
});
//改写方法2
constpromise=newPromise(function(resolve,reject){
setTimeout(function(){
reject(newError('test'));
},0)
});
阿波罗的战车
浏览 1391回答 2
2回答

达令说

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回调执行后的属于他的微任务队列中找到它然后执行,所以可以捕获错误
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答