2013-05-30 18 views
0

我对Javascript中的定时器有点困惑。 我一直在玩定时器。关于Javascript中定时器的混淆问题

我对异步事件中的排队过程如何发生困惑。 我已阅读关于异步事件如何排队的文章。 但是我发现很难绕过排队过程。

下面的代码:

http://jsbin.com/iwahuf/2/edit

在我已经发布将计时器按顺序queud的代码。事件队列中的定时器不会执行FIFO(先入先出)。

以下是我在活动队列中记住的内容。

  1. 第一定时器W/500ms的延迟
  2. 秒计时器W/600毫秒延迟
  3. 第三定时器W/300ms的延迟
  4. 四定时器W/400ms的延迟

在我看来,由于第一个计时器是第一个在事件队列中注册的计时器,它将是第一个被执行的计时器,并且只有在500毫秒后第二个计时器才会被执行,依此类推。

请在这个问题上给我启发。我是一个小混混。我认为我对排队过程的理解并不完全正确。

在此先感谢。

回答

2

注册计时器不会停止您的代码。您正在同时注册所有计时器,计划员将在注册后的N ms后尝试执行它们。

这意味着

  • 执行主代码后,你设置的第三个定时器将首先被执行300毫秒
  • 那么这将是第四个400毫秒被执行主代码后
  • 那么第一个和第二个

如果你想排队你的计时器,或者你链接他们(通过使他们每个人都会调用下一个)或者(如果任务很短的话更轻更简单)y你计算自己的时间:

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我给一个简单队列的实现。

+0

没错。没有“定时器队列”。如果你想这样做,你需要自己实现。即注册第一个计时器内的第二个计时器会添加它们。 –

+0

感谢您的回复。 我对你的陈述有些困惑,他们同时被执行。不是Javascript单线程,所以我认为只有一个异步事件或计时器将被注册在事件队列中。 – chanHXC

+0

@chanHXC很好,不完全是同一时间,但JS速度足够快,所以感觉就像是同一时间。 –

1

不,定时器不是先进先出的。

这不是被放在事件队列中的计时器自己 - 当计时器到期,他们产生“计时器经过”被添加到FIFO事件队列事件,因为它们到期

计时器对象如何实际检测到它们已过期并创建这些事件超出了范围,并且可能取决于实施。

+0

我在这里要纠正,所以这意味着定时器内的代码/进程将被执行N延迟,如果代码/进程被注册到事件队列中,除非浏览器可以自由执行一些东西。 – chanHXC

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"); 

希望这有助于您!

+0

感谢您的回复。我想你是正确的。即使我仍然有点困惑, – chanHXC

+0

从您的意见中,我认为您对计算机理论有足够的理解,以便找到有用的文章:http://ejohn.org/blog/how-javascript-timers-work/ – Khior