javascript - Javascript 中定时器的困惑

标签 javascript timer

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

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

代码如下:

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

在我发布的代码中,计时器将按顺序排队。事件队列中的定时器岂不是按先进先出(FIFO)方式执行的吗?

这是我在事件队列中想到的内容。

  1. 第一个定时器,延迟 500 毫秒
  2. 第二个定时器,延迟 600 毫秒
  3. 第三个定时器,延迟 300 毫秒
  4. 第四个定时器,延迟 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/

相关文章:

java - 如何让Rhino运行自定义的javascript setTimeout函数,无尽的eval

c# - 在循环中计算 DateTime.Now.Millisecond - C#

javascript - GWT 到 Javascript 的转换

javascript - JQuery $.post 关于提交事件帮助

javascript - 是否可以使用页面滚动条滚动内部 div?

C# - 如何在一段时间内阻止方法返回?

c# - 如果之前的事件仍然有效,System.Timers.Timer 是否可以结束事件?

java - quartz 触发器已成为过去

javascript - 使用函数式编程像 SQL 连接一样连接两个 JSON 对象数组

javascript - 类型错误 : newHandlerInfo is undefined in emberjs