我在尝试在事件监听器中测试Promise时遇到了问题。一切都很好,但执行顺序。
var test = document.querySelector('#test');
test.addEventListener('click',function(){
Promise.resolve().then(function(){
throw 'first';
}).catch(function(er){
console.log(er);
});
});
test.addEventListener('click',function(){
console.log('second');
});
test.click();
<div id="test"></div>
为什么第二个侦听器比第一个侦听器更早完成?
答案 0 :(得分:1)
第二个侦听器不依赖于第一个侦听器(promise),因此它们异步工作。你为什么把它们分开?您只需使用以下代码
即可 Promise
.resolve()
.then(function(){
throw 'first';
})
.catch(function(er){
console.log(er);
})
.finally(function(er) {
console.log('second');
};
});
答案 1 :(得分:1)
按照标准要求表现如下:
- 否则,如果承诺
[[PromiseState]]
内部广告位的值为"fulfilled"
,则为 一个。设value为promise[[PromiseResult]]
内部插槽的值 湾执行EnqueueJob("PromiseJobs", PromiseReactionJob, «fulfillReaction, value»)
。- 否则,如果承诺
醇>[[PromiseState]]
内部广告位的值为"rejected"
,则为 一个。让理性成为承诺[[PromiseResult]]
内部插槽的价值 湾执行EnqueueJob("PromiseJobs", PromiseReactionJob, «rejectReaction, reason»)
。
因此,当一个promise被解决或被拒绝时,相应的回调被安排在稍后运行,与当前执行异步。
参考文献: