Добавление новых объектов функции в массив и последующий вызов метода функции

Я не уверен, что использовал правильную терминологию в вопросе, но я запускаю серию вызовов функций по времени, используя цикл в моей функции playSequence() и setTimeOutFunction. Это много работает, но затем я хочу иметь функцию паузы, которая будет приостанавливать все таймеры, и функцию возобновления, которая возобновит все таймеры. Проблема в том, что когда я пытаюсь вызвать метод паузы функционального объекта в функции pauseAllTimers(), он выдает ошибку «Uncaught TypeError: объект 0 не имеет метода паузы». Любые идеи?

var timers = new Array();

function Timer(callback, delay) {
var timerId, start, remaining = delay;

this.pause = function() {
    window.clearTimeout(timerId);
    remaining -= new Date() - start;
};

this.resume = function() {
    start = new Date();
    timerId = window.setTimeout(callback, remaining);
};

this.resume();
}

function pauseAllTimers()
{
for (var timer in timers) 
{   
    timer.pause();
}
} 

function resumeAllTimers()
{
for (var timer in timers) 
{   
    timer.resume();
}
}

function playSequence()
{
var totaltimeout = 0;
for (var lesson_step_str in lesson_step) 
{
    var splitarr = lesson_step[lesson_step_str].split("|||");
    var element = splitarr[0];
    var txt = splitarr[1];
    var timeout = splitarr[2];
    totaltimeout += (timeout*1);
    console.log(totaltimeout);
    console.log(txt);

    (function(a,b){

     var timer = new Timer(function(){ displayText( a, b); }, totaltimeout * 1000);
     timers.push(timer);
  })(element, txt);

}   
}

person Dave    schedule 17.09.2013    source источник


Ответы (1)


Что ж, в циклах for timer возвращает индекс вместо объекта Timer, поэтому вам нужно сделать это следующим образом:

timers[timer].pause();

Ниже приведен рабочий код:

var timers = new Array();

var Timer = function (callback, delay) {
    this.timerId, this.start, this.remaining = delay;

    this.pause = function () {
        window.clearTimeout(this.timerId);
        this.remaining -= new Date() - this.start;
    };

    this.resume = function () {
        this.start = new Date();
        this.timerId = window.setTimeout(callback, this.remaining);
    };

    this.resume();
}

function pauseAllTimers() {
    for (var timer in timers) {
        timers[timer].pause();
    }
}

function resumeAllTimers() {
    for (var timer in timers) {
        timers[timer].resume();
    }
}

function playSequence() {
    var totaltimeout = 0;
    for (var i=1;i<6; i++) {    
        var txt = "this is part "+i, 
        element="#div"+i, timeout=2;
        totaltimeout += timeout;
        (function (a, b) {
            var timer = new Timer(function () {
                $("#divTxt").html(b);
            }, totaltimeout * 1000);
            timers.push(timer);
        })(element, txt);
    }
}

$(function(){
    $("#pauseAll").click(function(){
        pauseAllTimers();
    });

    $("#resumeAll").click(function(){
        resumeAllTimers();
    });

    playSequence();
});
person TheVillageIdiot    schedule 18.09.2013