Как использовать 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
.
Таким образом, потребление памяти остается низким, а вкладки браузера не зависают надолго.
Однако есть проблема: циклы не чередуются, следующий цикл запускается после завершения всех задач. Видите, временные петли не равны и постепенно увеличиваются: