在javascript sequencer中计时

时间:2015-01-14 11:33:37

标签: javascript angularjs performance web-applications html5-audio

我用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间隔),但我认为这一点是无关紧要的。

1 个答案:

答案 0 :(得分:2)

由于JS的单线程特性,Javascript计时器间隔不能保证在您请求的时间运行。你得到的是一个在时间间隔到期后排队等待运行的回调,每当引擎可以自由运行时

John resig已经深入探讨了这一点:

http://ejohn.org/blog/how-javascript-timers-work/

http://ejohn.org/blog/analyzing-timer-performance/

从他的结论来看,这对你的应用来说非常重要:

  

如果计时器被阻止立即执行,它将被延迟   直到下一个可能的执行点(将比...更长)   期望的延迟。)

由于JS中的计时器存在这些基本问题,我真的没有更好的解决方案,但这至少可以解释发生了什么。