我用javascript开发了音乐音序器;像这样:http://stepseq.michd.me/ 我已经使用setInterval函数以下列方式实现了循环:
var Sequencer = {
...
// every step sequencer ...
next: function(callback) {
// restart from begin if arrive to last sequecer step
if(Sequencer.current==Sequencer.steps.length)
Sequencer.current = 0;
// play all sounds in array step contains
if(Sequencer.steps[Sequencer.current].length>0) {
var set = Sequencer.steps[Sequencer.current];
for(var i=0;i<set.length;i++){
set[i].play();
}
}
callback(Sequencer.current);
Sequencer.current++;
},
loop: function(callback) {
Sequencer.interval = $interval(function(){
Sequencer.next(callback);
}, Sequencer.time);
}
}
...
下面的代码有效,但我认为有更好的方法来实现循环;事实上,有时步骤已经过时了。 Sequencer.time(传递给setInterval函数的时间)是以毫秒为单位的时间(此值是bpm值的转换;例如,它可以是125),
有人可以建议我一个更好的解决方案吗?
N.B。:这是一个基于web应用程序angularjs(由于这个原因,在上面的代码中使用了setInterval的$ interval间隔),但我认为这一点是无关紧要的。
答案 0 :(得分:2)
由于JS的单线程特性,Javascript计时器间隔不能保证在您请求的时间运行。你得到的是一个在时间间隔到期后排队等待运行的回调,每当引擎可以自由运行时。
John resig已经深入探讨了这一点:
http://ejohn.org/blog/how-javascript-timers-work/
http://ejohn.org/blog/analyzing-timer-performance/
从他的结论来看,这对你的应用来说非常重要:
如果计时器被阻止立即执行,它将被延迟 直到下一个可能的执行点(将比...更长) 期望的延迟。)
由于JS中的计时器存在这些基本问题,我真的没有更好的解决方案,但这至少可以解释发生了什么。