Timers Flashcards
setTimeout
Позволяет вызвать функцию один раз через определённый интервал времени
let timeoutID = window.setTimeout(func, [, delay, param1, param2, …]);
Время delay не гарантировано. Если основной поток call stack занят в момент наступление данного времени, то callback будет выполнен после освобождения call stack.
setInterval
Позволяет вызывать функцию регулярно, повторяя вызов через определённый интервал времени.
let intervalID = scope.setInterval(func, delay[, param1, param2, …]);
Чтобы получить плавную анимацию интервал должен быть 16 миллисекунд (1000мс / 60 кадров в секунду).
setTimeout with 0 delay
Даже если отсрочка установлена на 0, callback не вызовется сразу, а попадет в callback queue и будет ждать там очищения callstack для вызова.
Reference to current time in setTimeout
Поскольку на точность исполнения по delay времени полагаться нельзя, то если нам нужно текущее время, то лучше вызвать его в функции отдельно через new Date.
clearTimeout()
setTimeout возвращает «идентификатор таймера» timerId, который можно использовать для отмены дальнейшего выполнения.
let timerId = setTimeout(…);
clearTimeout(timerId);
clearInterval()
Чтобы остановить выполнение функции заданной через setInterval, необходимо вызвать этот метод с соответствующим Id.
let timerId = setInterval(() => alert(‘tick’), 2000);
// остановить вывод через 5 секунд
setTimeout(() => { clearInterval(timerId); alert(‘stop’); }, 5000);
Nested setTimeout()
Это отличный от setInterval способ запускать что-то регулярно.
Данный способ более гибкий, т.к. позволяет добавлять доп.условия на последующие запуски.
Пример кода:
let timerId = setTimeout(function tick() {
alert(‘tick’);
timerId = setTimeout(tick, 2000); // (*)
}, 2000);