Javascript 为什么承诺在事件发生前得到解决?
Javascript 为什么承诺在事件发生前得到解决?,javascript,Javascript,const first=document.getElementById('first'); const second=document.getElementById('second'); first.addEventListener('click',(e)=>{ console.log('first click start'); 等待(10000); 新承诺((解决、拒绝)=>{ 解决(“解决承诺”); }).然后((数据)=>console.log('Promise resolved',dat
const first=document.getElementById('first');
const second=document.getElementById('second');
first.addEventListener('click',(e)=>{
console.log('first click start');
等待(10000);
新承诺((解决、拒绝)=>{
解决(“解决承诺”);
}).然后((数据)=>console.log('Promise resolved',data));
log('first click finish');
});
second.addEventListener('click',(e)=>{
log(“第二次单击开始”);
log('second click finish');
});
//模拟长时间运行的过程
函数等待(毫秒){
var start=new Date().getTime();
var结束=开始;
同时(结束<开始+毫秒){
end=新日期().getTime();
}
}
首先
第二,你什么也不做,只是在它的定义中解决承诺。这样做很正常。如果您设置了一个解决承诺的超时,您将看到在该超时之后执行该承诺。检查此示例:
关键是,当您解决承诺时,它对于何时运行。然后块非常重要
const first=document.getElementById('first');
const second=document.getElementById('second');
first.addEventListener('click',(e)=>{
log('first click start');
新承诺((解决、拒绝)=>{
console.log(“承诺启动”);
setTimeout(函数(){
解决(“解决承诺”);
}, 3000);
}).然后((数据)=>console.log('Promise resolved',data))
log('first click finish');
});
second.addEventListener('click',(e)=>{
log(“第二次单击开始”);
log('second click finish');
});代码>
先点击我!
点击我第二代码>承诺的要点是它通常是异步的。你调用它,继续你的代码,一旦它完成,它将触发你中的代码,然后
现在,在你的情况下,你没有做任何需要时间来兑现承诺的事情,所以它会立即得到解决。如果您调用了一个API,并且需要2秒钟才能解决,那么它将一直持续下去
所以这里的事件顺序是:
先点击
触发第一个控制台日志
创造承诺
继续代码-触发第二个控制台日志
承诺结束是因为无事可做,控制台日志
。。。移动到第二次单击
我希望promise回调被称为last,这种想法背后的理性是什么?你按什么顺序点击按钮?如果您确实同时单击了它们,那么可以合理地预期,在两个按钮同时单击之后,promise回调会延迟-但不可能同时单击。谢谢您-我澄清了这一点-首先单击第一个按钮,然后单击第二个按钮。立即。@ArslArsl好的,“立即”还不够快,当你点击第二个按钮时,承诺已经解决,并安排了回调……好的,我明白了,明白你的意思。但是在这里——我不明白——为什么承诺解析放在回调的第二个按钮事件之前。把它们看作是单独的事件。如果在承诺解析之前单击第二个按钮,它将首先运行。然后执行下一步。把承诺想象成等待完成某件事,然后再运行其他人,就像一个事件链。假设promise像一个单独的事件一样进行—但它应该是在第二次按钮单击之后—在事件队列中,按钮单击没有排队,它们是由用户输入触发的。