Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么承诺在事件发生前得到解决?_Javascript - Fatal编程技术网

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像一个单独的事件一样进行—但它应该是在第二次按钮单击之后—在事件队列中,按钮单击没有排队,它们是由用户输入触发的。