使用时间列表调用setInterval或setTimeout?

时间:2018-02-05 11:22:31

标签: javascript setinterval

我对javascript不好,所以如果我的问题不正确,请原谅。

我尝试为录制的midi“定时事件”制作一个playfunction,它们是使用performance.now录制的,理想情况下我希望setInterval将数组作为参数列表:)。 但我想这是不可能的。我无法弄清楚如何使用setInterval或setTimeout与我的时序数组。我预先计算了下面的事件和存储之前的时间差异,但似乎setInterval不会改变,也许我必须在设置新的时间之前每次都清除它?

任何帮助表示赞同,可能setInterval或setTimeout不适合使用时间列表执行sendnote?

function play(){
lastelement=track[0].midiMess.length;
var x=0; 
var waitEv=new Array();
//INIT FIRST EVENT
waitEv[x]=track[0].midiMess[x].time;
x++;
//LOOP THRU ALL EVENTS CALCULATE TIMEDIFFERENCES
while(x<lastelement){
    waitEv[x]=track[0].midiMess[x].time-track[0].midiMess[x-1].time;
    x++;
}
y=0;
playin=setInterval(playEvent,waitEv[y]);
}

function playEvent(){
noteOnMessage = [track[0].midiMess[y].data0,track[0].midiMess[y].data1,track[0].midiMess[y].data2];
output.send(noteOnMessage);  
y++;
if (y==lastelement) clearInterval(playin);
}

1 个答案:

答案 0 :(得分:1)

而不是使用setInterval,而是使用另一个选项来链接setTimeout。

这是一个这样做的例子。

PS。请注意setTimeouts&amp; setInterval对准确性有一定的限制,如果你发现这不够准确,另一个选择是使用一些高性能定时器,..

var waitlist = [1000, 2000, 1000, 3000, 2000, 1000];

function doWait() {
    if (waitlist.length) {
        var waittime = waitlist.shift();
        console.log("Waiting: " + waittime);
        setTimeout(doWait, waittime);
    }
}

//boostrap our wait loops
doWait();