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

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? Спасибо:)

6 ответов

Решение

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);

clearInterval является одним из вариантов:

var interval = setInterval(doStuff, 2000); // 2000 ms = start after 2sec 
function doStuff() {
  alert('this is a 2 second warning');
  clearInterval(interval);
}

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

var interval = null;    

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

function stopStuff() {
    clearInterval(interval);
}

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

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

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

clearInterval(timerobject._id)

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

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

Если нам нужно использовать таймеры, лучше всего использоватьsetTimeoutвместоsetInterval.

Таким образом, потребление памяти остается низким, а вкладки браузера не зависают надолго.

Однако есть проблема: циклы не чередуются, следующий цикл запускается после завершения всех задач. Видите, временные петли не равны и постепенно увеличиваются:

Другие вопросы по тегам