0

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

我对异步事件中的排队过程如何发生感到困惑。我已阅读有关异步事件如何排队的文章。但我发现排队过程很难理解。

这是代码:

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

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

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

  1. 具有 500 毫秒延迟的第一个计时器
  2. 带 600 毫秒延迟的第二个计时器
  3. 第三个定时器,延迟 300 毫秒
  4. 第四个定时器,延迟 400 毫秒

在我看来,由于第一个定时器是第一个注册到事件队列中的,它会是第一个被执行的,只有在 500ms 之后才会执行第二个定时器,依此类推。

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

提前致谢。

4

3 回答 3

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

在这个有点相关的答案中,我给出了一个简单队列的实现。

于 2013-05-30T11:17:29.467 回答
1

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

放入事件队列的不是计时器本身 - 当计时器到期时,它们会导致在到期时将“计时器已过”事件添加到 FIFO 事件队列

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

于 2013-05-30T11:20:53.727 回答
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");

希望这可以帮助!

于 2013-05-30T11:21:52.663 回答