JS中的时间 – 同时运行并同时启动的多个setIntervals?

假设我有一个function:

myFunc = function(number) { console.log("Booyah! "+number); } 

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

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

 setInterval(function(){ myFunc(1); }, 500); setInterval(function(){ myFunc(2); }, 1000); setInterval(function(){ myFunc(3); }, 2000); 

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

你如何确保它们全部同时启动以便它们同步?

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

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

并使用它:

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

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

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

JavaScript是单线程的。 您可以使用html5 web worker或尝试递归使用setTimeout。 按照此示例创建多个函数:

 var interval = setTimeout(appendDateToBody, 5000); function appendDateToBody() { document.body.appendChild( document.createTextNode(new Date() + " ")); interval = setTimeout(appendDateToBody, 5000); } 

阅读这篇文章:

http://weblogs.asp.net/bleroy/archive/2009/05/14/setinterval-is-moderately-evil.aspx

你可以做这样的事情。

 arr = Array(); arr[0] = "hi"; arr[1] = "bye"; setTimer0 = setInterval(function(id){ console.log(arr[id]) },1000,(0)); setTimer1 = setInterval(function(id){ console.log(arr[id]); },500,(1)); 

希望能帮助到你!