function delay(time) {
var date = new Date();
while (new Date() - date < time) {};
}
function a(n) {
alert(n);
}
function c(n) {
console.log(n);
}
setTimeout(()=>{a(1);}, 1000);
setTimeout(()=>{c(2);}, 3000);
setTimeout(()=>{c(3);}, 3000);
setTimeout(()=>{c(4);}, 3000);
setTimeout(()=>{c(5);}, 3000);
setTimeout(()=>{c(6);}, 3000);
当我使用此代码时,2~6的顺序是随机的。 为什么“警告”使浏览器这样做?
我发现定时器被延迟以在使用“alert”时将回调放入回调队列,而不是在使用“delay”时。但我不明白为什么在完成“警告”之后它没有按特定顺序放回回来
我试过这个:
setTimeout(()=>{a(1);delay(3000)}, 1000);
setTimeout(()=>{c(2);}, 1000);
setTimeout(()=>{c(3);}, 1001);
setTimeout(()=>{c(4);}, 1002);
setTimeout(()=>{c(5);}, 1003);
setTimeout(()=>{c(6);}, 1004);
结果是:
5 3 4 6 2
如果我这样做:
setTimeout(()=>{c(1);delay(3000)}, 1000);
setTimeout(()=>{c(2);}, 1000);
setTimeout(()=>{c(3);}, 1000);
setTimeout(()=>{c(4);}, 1000);
setTimeout(()=>{c(5);}, 1000);
setTimeout(()=>{c(6);}, 1000);
结果是:
1 2 3 4 5 6
我只是想知道为什么警告阻止js会有所不同。
嗯,订单只在Chrome中是随机的,而不是在IE或Firefox中。
答案 0 :(得分:0)
它不是警报,而是console.log的响应时间。 即使按顺序安排它们也不能保证执行以相同的顺序结束。因为它们在3秒后被激活(+运行下一个setTimeout指令的时间),执行在另一个时间结束,与启动时间无关。
您应该为每个 setTimeout 调用添加一个偏移量,以获得更多的保证金时间来按顺序获取响应。
答案 1 :(得分:0)
这不是因为警报,而是因为它们都具有相同的时间延迟,并且它们没有按照您的预期排列在队列中。
如果你想实现这一目标,那就做:
function a(n) {
alert(n);
}
function c(n) {
console.log(n);
}
setTimeout(()=>{a(1);}, 1000);
setTimeout(()=>{
c(2);
c(3);
c(4);
c(5);
c(6);
}, 3000);
,订单将被保留。