使用javascript计划执行

时间:2016-05-30 11:14:09

标签: javascript scheduled-tasks settimeout

我有一个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);
}

有没有更好的方法来保证确切的时间?

2 个答案:

答案 0 :(得分: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);
};

答案 1 :(得分: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();