为什么javascript promise在使用alert和console.log时表现得很奇怪?
我有下面一段代码为什么javascript promise在使用alert和console.log时表现得很奇怪?,javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我有下面一段代码 函数callPr(){ 返回新承诺(功能(res、rej){ setTimeout(函数(){ res(); }, 0); }); } callPr()。然后(函数(){ 警报('Promise Done');//此警报在循环运行前弹出 console.log('Promise Done');//循环运行后打印此控制台 }); 对于(变量i=0;i
函数callPr(){
返回新承诺(功能(res、rej){
setTimeout(函数(){
res();
}, 0);
});
}
callPr()。然后(函数(){
警报('Promise Done');//此警报在循环运行前弹出
console.log('Promise Done');//循环运行后打印此控制台
});
对于(变量i=0;i<5;i++){
控制台日志(i)
}
事实上,yes promise是异步的,但它是非阻塞的,因此代码将继续。我想如果您有一个大循环,您会注意到console.log将位于循环之间,因为。然后,和循环将一起运行
在上面的代码中,在for循环运行之前弹出警报
alert
在console.log
调用之后肯定不会被调用,这就是我在Chrome、Firefox和Edge上运行您的代码片段时看到的then
处理程序总是异步调用的,但是您的for
循环与调用then
添加回调处于同一同步任务中,因此循环肯定会在then
回调之前运行
然而,alert
是一件奇怪且不合时宜的事情。我可以想象,如果警报
停止UI行为,在您解除警报
之前,某些浏览器可能不会呈现控制台.log的结果
如果在您使用的浏览器中发生这种情况,下面是一个更可靠的事情顺序指示器:
var actions=[];
函数callPr(){
返回新承诺(功能(res、rej){
setTimeout(函数(){
行动。推动(“解决承诺”);
res();
}, 0);
});
}
行动。推动(“创造承诺”);
callPr()。然后(函数(){
行动。推动(“承诺完成”);
//拖延只是为了证明没有其他事情等着发生
setTimeout(函数(){
控制台日志(操作);
}, 800);
});
对于(变量i=0;i<5;i++){
动作。推(“循环”+i);
}
。作为控制台包装器{
最大高度:100%!重要;
}
我无法复制。只有在发出警报后,我才能在日志中看到Promise Done
。对我来说,循环首先运行,然后弹出警报,然后Promise Done
打印到控制台,我相信这应该是预期的正确行为。我也是@31piy。让它至少超时1秒,然后你就可以看到你想要的东西了。我很好奇你使用的是什么浏览器,什么版本。alert()
由于它的阻塞特性,确实会弄乱Javascript中某些东西的计时。尝试调试定时问题时,请不要使用alert()
。只使用console.log()
。