Как использовать setInterval и clearInterval?

138
function doKeyDown(event) {
    switch (event.keyCode) {
    case 32:
        /* Space bar was pressed */
        if (x == 4) {
            setInterval(drawAll, 20);
        }
        else {
            setInterval(drawAll, 20);
            x += dx;
        }
        break;
    }
}

Всем привет,

Я хочу вызвать drawAll()один раз, не создавая цикл, который вызывает drawAllснова и снова, должен ли я использовать рекурсивный метод для этого или я должен использовать clearInterval?

Также, пожалуйста, скажите мне использовать clearInterval? Спасибо :)

Радж
источник

Ответы:

210

setIntervalустанавливает повторяющийся таймер Он возвращает дескриптор, который вы можете передать, clearIntervalчтобы остановить его:

var handle = setInterval(drawAll, 20);

// When you want to cancel it:
clearInterval(handle);
handle = 0; // I just do this so I know I've cleared the interval

В браузерах дескриптор гарантированно будет числом, не равным 0; следовательно, 0делает удобное значение флага для "таймера не установлено". (Другие платформы могут возвращать другие значения; функции таймера NodeJS, например, возвращают объект.)

Чтобы запланировать функцию только один раз, используйте setTimeoutвместо этого. Это не будет продолжать стрелять. (Он также возвращает дескриптор, с помощью которого вы можете отменить его, clearTimeoutпрежде чем запустить его один раз, если это необходимо.)

setTimeout(drawAll, 20);
TJ Crowder
источник
29

clearInterval - это один из вариантов:

var interval = setInterval(doStuff, 2000); // 2000 ms = start after 2sec 
function doStuff() {
  alert('this is a 2 second warning');
  clearInterval(interval);
}
Джошуа - Пендо
источник
7
Никогда не используйте строки с setIntervalили setTimeout.
TJ Crowder
1
Вы имеете в виду, что я должен удалить кавычки, окружающие doStuff ()?
Джошуа - Пендо
9
Да, и цитаты, и парены. Просто: setInterval(doStuff);. Передача строки в setIntervalэто неявный вызов eval. Лучше вместо этого передать ссылку на функцию .
TJ Crowder
1
Ах да, отрицательный голос, возможно, справедлив. Я показал пример, который не верен (хотя это работает в моих случаях, но я изменяю их, как мы говорим). Недурно! :)
Джошуа - Пендо
10

Используйте setTimeout(drawAll, 20)вместо этого. Это только выполняет функцию один раз.

dlev
источник
Большое спасибо, но setTimeout заканчивает цикл в каждой точке, я использую другой подход и он работает нормально, функция doKeyDown (event) {switch (event.keyCode) {case 32: / * Нажата пробел * / loop = setInterval (DrawAll, 20); если (х == 202) {х = 400; вертушка (); } перерыв; }}
Радж
это был не тот вопрос
Нино Шкопац
8

Я использовал угловой с электроном,

В моем случае setIntervalвозвращает объект Nodejs Timer. который, когда я назвал clearInterval(timerobject)это, не работал.

Я должен был сначала получить идентификатор и позвонить в clearInterval

clearInterval(timerobject._id)

Я боролся много часов с этим. надеюсь это поможет.

PJ3
источник
5

Примечание: если вы хотите использовать отдельные функции для установки и очистки интервала, переменная интервала должна быть доступна для всех из них, в «относительной глобальной» или «на один уровень вверх» области:

var interval = null;    

function startStuff(func, time) {
    interval = setInterval(func, time);
}

function stopStuff() {
    clearInterval(interval);
}
HynekS
источник