关于Javascript中的计时器的混淆

时间:2013-05-30 11:16:23

标签: javascript timer

我对Javascript中的计时器有点困惑。 我一直在玩定时器。

我对异步事件中排队过程的发生方式感到困惑。 我读过有关异步事件是如何排队的文章。 但我发现很难围绕排队过程。

以下是代码:

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

在我发布的代码中,定时器按顺序排列。事件队列中的定时器不会被执行FIFO(先进先出)。

以下是我在事件队列中的想法。

  1. 第一个定时器w / 500ms延迟
  2. 第二个定时器,有600毫秒延迟
  3. 第三个定时器,有300毫秒延迟
  4. 第四个定时器,有400毫秒延迟
  5. 在我看来,由于第一个定时器是第一个在事件队列中注册的定时器,它将是第一个被执行的定时器,并且只有在500ms后才会执行第二个定时器,依此类推。

    请就此事赐教。我很困惑。我认为我对排队过程的理解不太正确。

    提前致谢。

3 个答案:

答案 0 :(得分:2)

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

这意味着

  • 您设置的第三个计时器将在执行主代码后的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我给出了一个简单队列的实现。

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

希望这有帮助!