我对Javascript中的计时器有点困惑。 我一直在玩定时器。
我对异步事件中排队过程的发生方式感到困惑。 我读过有关异步事件是如何排队的文章。 但我发现很难围绕排队过程。
以下是代码:
http://jsbin.com/iwahuf/2/edit
在我发布的代码中,定时器按顺序排列。事件队列中的定时器不会被执行FIFO(先进先出)。
以下是我在事件队列中的想法。
在我看来,由于第一个定时器是第一个在事件队列中注册的定时器,它将是第一个被执行的定时器,并且只有在500ms后才会执行第二个定时器,依此类推。
请就此事赐教。我很困惑。我认为我对排队过程的理解不太正确。
提前致谢。
答案 0 :(得分:2)
注册计时器不会停止您的代码。您正在同时注册所有计时器,调度程序将在注册后N ms尝试执行它们。
这意味着
如果你想对你的计时器进行排队,你可以将它们连接起来(通过让它们中的每一个调用下一个)或者(如果任务很短,那么更轻,更简单)你自己计算时间:
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我给出了一个简单队列的实现。
答案 1 :(得分:1)
不,计时器不是先进先出。
不是定时器本身被放入事件队列中 - 当定时器到期时,它们会导致“定时器已过去”事件在它们到期时被添加到FIFO事件队列 。
计时器对象如何实际检测到它们已过期并创建这些事件超出了范围,并且可能依赖于实现。
答案 2 :(得分:1)
在Javascript中设置超时时,它不会停止执行以下代码。相反,它会将函数集的执行延迟到超时运行。要获得预期的结果,您的代码需要如下所示:
setTimeout(function(){
console.log("First Timer");
setTimeout(function(){
console.log("Second Timer");
setTimeout(function(){
console.log("Third Timer");
setTimeout(function(){
console.log("Fourth Timer");
}, 400);
}, 300);
}, 600);
}, 500);
console.log("Executed immediately");
希望这有帮助!