Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.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 promise在使用alert和console.log时表现得很奇怪?_Javascript_Asynchronous_Promise - Fatal编程技术网

为什么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()