我对 Javascript 中的计时器有点困惑。 我一直在玩弄计时器。
我对异步事件中的排队过程如何发生感到困惑。 我读过有关异步事件如何排队的文章。 但我发现很难理解排队过程。
代码如下:
http://jsbin.com/iwahuf/2/edit
在我发布的代码中,计时器将按顺序排队。事件队列中的定时器岂不是按先进先出(FIFO)方式执行的吗?
这是我在事件队列中想到的内容。
- 第一个定时器,延迟 500 毫秒
- 第二个定时器,延迟 600 毫秒
- 第三个定时器,延迟 300 毫秒
- 第四个定时器,延迟 400 毫秒
在我看来,由于第一个计时器是第一个被注册到事件队列中的,因此它将是第一个被执行的,并且只有在500ms之后才会执行第二个计时器,依此类推。
请您赐教一下这个问题。我有点困惑。我觉得我对排队过程的理解不太正确。
提前致谢。
最佳答案
注册计时器不会停止您的代码。您同时注册所有计时器,调度程序将在注册时间后 N 毫秒尝试执行它们。
这意味着
- 您设置的第三个计时器将在主代码执行后 300 毫秒执行
- 那么将是主代码执行后的第四个400毫秒
- 然后是第一个和第二个
如果您想对计时器进行排队,可以将它们链接起来(通过让每个计时器调用下一个),或者(如果任务很短,则更轻更简单)您自己计算时间:
var time = 0;
setTimeout(function(){
console.log("First Timer");
}, time += 500);
setTimeout(function(){
console.log("Second Timer");
}, time += 600);
console.log("Executed immediately");
setTimeout(function(){
console.log("Third Timer");
}, time += 300);
setTimeout(function(){
console.log("Fourth Timer");
}, time += 400);
In this somewhat related answer我给出了一个简单队列的实现。
关于javascript - Javascript 中定时器的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16834740/