JS中的计时 - 多个setIntervals同时运行并同时启动?

Jos*_*eau 22 javascript jquery timing intervals

假设我有一个功能:

myFunc = function(number) {
  console.log("Booyah! "+number);
}
Run Code Online (Sandbox Code Playgroud)

我希望它在设定的时间间隔内运行.听起来我应该使用setInterval,呵呵!

但是,如果我想运行相同功能的多个间隔,所有这些都在同一时间开始呢?

setInterval(function(){
  myFunc(1);
}, 500);

setInterval(function(){
  myFunc(2);
}, 1000);

setInterval(function(){
  myFunc(3);
}, 2000);
Run Code Online (Sandbox Code Playgroud)

因此,第一个运行时间恰好两次,第二个运行一次,第二个和第三个之间相同.

你如何确保它们都在同一时间开始,以便它们同步?

JAA*_*lde 22

好问题,但在JS你不能.要在同一程序中执行多个功能,您需要同时执行多线程和一些深度计时和线程处理技能.JS是单线程的.setInterval在延迟之后没有实际运行该函数,而是在延迟之后它将函数添加到事件堆栈中,以便在处理器可以运行时立即运行.如果proc正忙于另一个操作,则实际运行所需的时间将超过延迟时间.多个间隔/超时都会添加对同一事件堆栈的调用,因此它们会在proc可用时依次运行.


小智 6

function Timer(funct, delayMs, times)
{
  if(times==undefined)
  {
    times=-1;
  }
  if(delayMs==undefined)
  {
    delayMs=10;
  }
  this.funct=funct;
  var times=times;
  var timesCount=0;
  var ticks = (delayMs/10)|0;
  var count=0;
  Timer.instances.push(this);

  this.tick = function()
  {
    if(count>=ticks)
    {
      this.funct();
      count=0;
      if(times>-1)
      {
        timesCount++;
        if(timesCount>=times)
        {
          this.stop();
        }
      }
    }
    count++; 
  };

  this.stop=function()
  {
    var index = Timer.instances.indexOf(this);
    Timer.instances.splice(index, 1);
  };
}

Timer.instances=[];

Timer.ontick=function()
{
  for(var i in Timer.instances)
  {
    Timer.instances[i].tick();
  }
};

window.setInterval(Timer.ontick, 10);
Run Code Online (Sandbox Code Playgroud)

并使用它:

function onTick()
{
  window.alert('test');
}
function onTick2()
{
  window.alert('test2');
}
var timer = new Timer(onTick, 2000,-1);
var timer = new Timer(onTick2, 16000,-1);
Run Code Online (Sandbox Code Playgroud)

对于有限数量的刻度,将最后一个参数更改为数字的正整数.我用-1表示连续运行.

忽略任何告诉你不能的人.你可以做任何你喜欢的事情!