阮一峰的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 回答
达令说
TA贡献1821条经验 获得超6个赞
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回调执行后的属于他的微任务队列中找到它然后执行,所以可以捕获错误
添加回答
举报
0/150
提交
取消