JavaScript setTimeout警报顺序

时间:2017-09-22 14:59:54

标签: javascript settimeout alert

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中。

2 个答案:

答案 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);

,订单将被保留。