Theory and Tasks for Students - Spring 2019
Таймеры

В Javascript есть две функции, которые позволяют вызывать другие функции с задержкой времени один или несколько раз - setTimeout(func, delay) и setInterval(func, interval). Несмотря на то, что они похожи, в их использовании есть несколько особенностей. Например, если требуется написать скрипт, который регулярно посылает запрос на сервер, проверяя наличие новых сообщений. Так как это действие должно производиться постоянно, пока открыта страница, интуитивно хочется написать что-то вроде следующего: setInterval(ajax_CheckMessages, 1000); // интервал в 1000ms Однако, такой вариант является неправильным - если ответ сервера приходит дольше, чем за 1 секунду, веб-страница отправить ещё один запрос, не дожидаясь предыдущего ответа, что как минимум ненадежно. Другая проблема возникнет в случае, если функция в таймер требует больше времени на выполнение, чем указанный интервал - тогда время между вызовами этой функции увеличится.

Работа функции setInterval()

Для более полного контроля над запуском функций с задержкой во времени лучше использовать setTimeout(), создавая что-то похожее на рекурсию: function ajax_CheckMessages(interval) { $.ajax({ // различные данные complete : function() { // обработка результата setTimeout(ajax_CheckMessages, interval); } }); } ajax_CheckMessages(1000); Таким образом, новый запрос будет отправлен только через секунду после получения ответа сервера.

Работа функции setTimeout()

Другая тонкость - setInterval() и setTimeout() возвращают специальный индентификатор, с помощью которого этот выполнение функции с этим таймаутом/интервалом можно отменить - его надо передать в качестве аргументам функциям clearInterval() и clearTimeout(id) соответственно: var count = 0; var t = setInterval(function() { window.console.log(count++); if (count > 5) { clearInterval(t); } }, 1000);