Javascript 承诺中的同步执行顺序
我在尝试在事件侦听器中测试承诺时遇到问题。除了执行令,一切都很好Javascript 承诺中的同步执行顺序,javascript,promise,Javascript,Promise,我在尝试在事件侦听器中测试承诺时遇到问题。除了执行令,一切都很好 var test=document.querySelector(“#test”); test.addEventListener('click',function(){ Promise.resolve().then(函数()){ 扔“第一”; }).catch(函数(er){ 控制台日志(er); }); }); test.addEventListener('click',function(){ console.log('seco
var test=document.querySelector(“#test”);
test.addEventListener('click',function(){
Promise.resolve().then(函数()){
扔“第一”;
}).catch(函数(er){
控制台日志(er);
});
});
test.addEventListener('click',function(){
console.log('second');
});
test.click()代码>
第二个侦听器不依赖于第一个侦听器(promise),因此它们异步工作。你为什么把它们分开?您可以简单地使用以下代码
Promise
.resolve()
.then(function(){
throw 'first';
})
.catch(function(er){
console.log(er);
})
.finally(function(er) {
console.log('second');
};
});
根据标准要求,其表现如下:
否则,如果承诺的[[PromiseState]]
内部插槽的值是“已完成”
,
A.让value为promise的[[PromiseResult]]
内部插槽的值。
B执行排队作业(“PromiseJobs”,PromiseActionJob,«完成反应,值»)
李>
否则,如果PromiseState的[[PromiseState]]
内部插槽的值为“已拒绝”
,
A.让理由成为承诺的[[PromiseResult]]
内部插槽的值。
B执行排队作业(“PromiseJobs”,PromiseActionJob,«拒绝反应,原因»)
李>
因此,当一个承诺被解析或拒绝时,相应的回调将被安排在稍后运行,与当前执行异步
参考资料:
然后对其他代码异步调用
的回调。你说的“完成”是什么意思?@zerkms你怎么知道的?你有什么文件吗?这是一个bug还是预期的行为?@Bergi finish实际上是在执行。它实际上是在标准中:后跟我知道它们是异步执行的。但是,如果Promise.then
是同步的,那么执行顺序应该颠倒。@JaromandaX你没有明白我的意思。事件侦听器显然是异步执行的,但是承诺。我这么说是因为我认为最好有一个同步版本的Promise。然后。我试着理解@Tresdin。好的,我们知道Promise.resolve()
和console.log('second')
是两个异步代码块Promise.resolve()
需要更多的时间来执行,所以这就是为什么首先看到console.log('second')
正在运行的原因。在这种情况下,如果您希望您的console.log('second')
自信地在第一个侦听器之后运行,您必须将其放入然后,捕获或最终
块,这就是我们称之为同步执行:)希望我在@TresdinBig中理解了您的观点感谢规范的解释。我认为异步执行通常应用于长时间运行的操作(I/O、CPU密集型等)。在这种情况下实现它是没有意义的。你知道为什么应该承诺。那么应该是异步的吗?我知道最初它是这样要求的。我也不确定,但有一种可能性,即内在的承诺只是采用了这种行为。我个人不知道它们是异步的技术原因是什么。从另一方面来说,我确实意识到,即使它们与已经解决/拒绝的承诺同步,你最好还是不要依赖它,因为那样你会有两种不同的行为。因此,最初的想法可能是提供一致的行为。@zerkms:没错,然后
回调会一致(可靠)异步执行。@Tresdin:嗯,如果没有长时间运行的操作,就不应该使用承诺。如果希望它是同步的,则不能使用,然后使用。