Выполнение кода после clearInterval - PullRequest
4 голосов
/ 01 октября 2011

У меня есть setInterval, вызывающий цикл, который отображает анимацию.

Когда я clearInterval в ответ на пользовательский ввод, возможно, есть один или несколько обратных вызовов цикла в очереди. Если я помещаю вызов функции непосредственно после оператора clearInterval, сначала завершается вызов функции (что-то печатается на экране), затем выполняется обратный вызов цикла в очереди, удаляя то, что я хотел напечатать.

См. Код ниже.

function loop() {
    // print something to screen
}

var timer = setInterval(loop(), 30);

canvas.onkeypress = function (event) {
    clearInterval(timer);
    // print something else to screen
}

Какой лучший способ справиться с этим? Поставить задержку на // print something else to screen? Делаете новую печать в цикле?

Редактировать: Спасибо за ответы. Для дальнейшего использования моя проблема заключалась в том, что событие, которое вызвало дополнительную печать, было скрыто в цикле, поэтому после его выполнения управление было возвращено в незавершенный цикл, который затем перезаписал его. Приветствия.

Ответы [ 2 ]

2 голосов
/ 01 октября 2011

Во-первых, вы, вероятно, имели в виду:

var timer = setInterval(loop, 30);

Во-вторых, вы уверены, что вызов clearInterval не очищает очередь ожидающих вызовов loop()?Если это так, вы можете легко отключить эти вызовы, используя своего рода защиту:

var done = false;

function loop() {
    if(!done) {
      // print something to screen
    }
}

var timer = setInterval(loop(), 30);

canvas.onkeypress = function (event) {
    clearInterval(timer);
    done = true;
    // print something else to screen
}
1 голос
/ 01 октября 2011

Вы также можете использовать флаг, чтобы игнорировать любые функции из очереди:

var should;

function loop() {
    if(!should) return; // ignore this loop iteration if said so

    // print something to screen
}

should = true;
var timer = setInterval(loop, 30); // I guess you meant 'loop' without '()'

canvas.onkeypress = function (event) {
    should = false; // announce that loop really should stop
    clearInterval(timer);
    // print something else to screen
}
...