2016-05-30 3 views
-1

У меня есть массив JavaScript функции и задержки в миллисекундах:Запланированное исполнение с JavaScript

var events = [ 
    {event: function_1, delay: 1234}, 
    {event: function_2, delay: 2456}, 
    ... 
    {event: function_n, delay: 13154} 
] 

и клип. Идея заключается в том, когда фильм воспроизводится для выполнения функций в порядке, заданном аргументом задержки. Один из способов сделать это:

video.play(); 
for (var i = 0; i < events.length; i++) { 
    setTimeout(events[i].event(), events[i].delay); 
} 

Есть ли лучший способ сделать это, чтобы гарантировать точное время?

+1

вы можете посмотреть в [requestAnimationFrames] (https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame). Если интервал фиксирован, вы даже можете попробовать 'setInterval'. Что-то вроде этого: 'function initTimer() {var count = 0; selInterval (function() {events [count] .event}, delay)} ' – Rajesh

+0

просто используйте один таймер через' setInterval' –

+0

Я голосую, чтобы закрыть этот вопрос как не по теме, потому что он просит лучшего способа кода что нибудь. это звучит как работа для codereview.stackexchange.com –

ответ

0

Чтобы оценить события последовательно, вам необходимо вызвать функцию обратного вызова после каждого события. В обратном вызове вы запускаете следующее событие.

events.shift() удаляет первое событие из списка. В конце всех выполняемых событий список событий останется пустым.

var events = [ 
    { event: function_1, delay: 1000 }, 
    { event: function_2, delay: 2000 }, 
    { event: function_n, delay: 10100 } 
]; 

function triggerEvents(events) { 
    if(events.length === 0) { 
     // all events completed 
     return; 
    } 

    // get the first event from list 
    var event = events.shift();  

    setTimeout(function() { 
     event.event(function() { 
      startEvents(events); 
     }); 
    }, event.delay); 
}; 
0

Вы можете использовать setTimeout с рекурсией.

Примечание: Я предположил, что задержка увеличивается фиксированным образом.

var refresh_count = 0; 
 
var delay = 1000; 
 
var events = [ 
 
    { event: notify.bind(this, "test") }, 
 
    { event: notify.bind(this, "foo") }, 
 
    { event: notify.bind(this, "Hello World")}]; 
 

 
function notify(str) { 
 
    console.log(str); 
 
} 
 

 
function initTimeout() { 
 
    setTimeout(function() { 
 
    if (events[refresh_count]) { 
 
     events[refresh_count++].event(); 
 
     initTimeout(); 
 
    } 
 
    }, delay + (refresh_count * 1000)); 
 
} 
 

 
initTimeout();

Смежные вопросы