setTimeout и setInterval — какая разница и существует ли взаимозаменяемость?

Друзья, Вам наверное уже известно, что для отмера временных интервалов в Javascript имеется две похожих функции — setTimeout() и setInterval().

ptr = setTimeout(func, timeout);

 

ptr = setInterval(func, timeout);

Разница в них такая, что setTimeout() отрабатывает ровно один раз, т.е. вызывает через указанный интервал указанную функцию и останавливает свою работу. Вторая функция же, setInterval() принимает точно такие же параметры, но вызвав функцию однажды, она продолжает делать это снова и снова через одинаковые промежутки времени. Остановить её работу можно только с помощью функции clearInterval(ptr), где ptr — ссылка на объект, полученная как результат выполнения функции setInterval().

Можно ли во всех ситуациях применять только первую функцию или только вторую? Или в некоторых ситуациях удобнее применять одну, а в других другую? Давайте рассмотрим подробнее.

Очевидно, что setTimeout() удобнее там, где нам не нужна многократная обработка, а нужен только однократный вызов некоего куска программы. По сути это — однократный таймер задержки. Можно в вызванном обработчике запустить новый setTimeout() и тем самым организовать циклическое выполнение кода с возможностью прервать выполнение в любой момент (для разрыва цикла можно просто очередной раз не создавать новый setTimeout()).

Но в последнем свойстве setTimeout() кроется засада и частая ошибка начинающих программистов.

Некоторые начинают использовать эту функцию для реализации секундного таймера для часов или подобных реалтаймных вещей, причём я видел данную ошибку даже на больших и уважаемых сайтах. Друзья! Категорически нельзя использовать setTimeout() как счётчик секунд! Ведь от момента, когда вызван обработчик и до момента, когда запущен новый цикл setTimeout() всегда проходит некоторое время! Даже сама функция setTimeout() требует для своего запуска несколько микросекунд! В итоге получается такое, что через несколько минут работы такого «таймера» секунды начинают достаточно заметно отличаться от действительных!

Я так же видел, что некоторые замечают это и пытаются компенсировать отставание путём установки задержки не в 1000 микросекунд, а, скажем, 996 (получают экспериментально). Но соль в том, что это значение для каждого клиентского компьютера разное, ведь быстродействие компьютеров и даже разных браузеров разное.

В то же время setInterval() лишена такого недостатка, так как в момент, когда вызван ваш обработчик, функция уже начала отсчёт следующего интервала, то есть длительность её интервалов не зависит от вашего кода.

Вот пожалуй и всё на сегодня. Спасибо за внимание.

Отправить ответ

Оставьте первый комментарий!

Notify of
avatar
wpDiscuz