Книга: JavaScript. Подробное руководство, 6-е издание
14.1. Таймеры
14.1. Таймеры
Функции setTimeout()
и setlnterval()
позволяют зарегистрировать функцию, которая будет вызываться один или более раз через определенные интервалы времени. Это очень важные функции для клиентского JavaScript, и поэтому они были определены как методы объекта Window
, несмотря на то что являются универсальными функциями, не выполняющими никаких действий с окном.
Метод setTimeout()
объекта Window планирует запуск функции через определенное число миллисекунд. Метод setTimeout()
возвращает значение, которое может быть передано методу clearTimeout()
, чтобы отменить запланированный ранее запуск функции.
Метод setlnterval()
похож на setTimeout(),
за исключением того, что он автоматически заново планирует повторное выполнение через указанное количество миллисекунд:
setInterval(updateClock, 60000); // Вызывать updateClock() через каждые 60 сек.
Подобно setTimeout(),
метод setlnterval()
возвращает значение, которое может быть передано методу clearlnterval()
, чтобы отменить запланированный запуск функции.
В примере 14.1 определяется вспомогательная функция, которая ожидает указанный интервал времени, многократно вызывает указанную функцию и затем отменяет запланированные вызовы по истечении другого заданного интервала времени. Этот пример демонстрирует использование методов setTimeout(), setlnterval()
и clearlnterval().
Пример 14.1. Вспомогательная функция для работы с таймером
/*
* Планирует вызов или вызовы функции f() в будущем.
* Ожидает перед первым вызовом start миллисекунд, затем вызывает f()
* каждые interval миллисекунд и останавливается через start+end миллисекунд.
* Если аргумент interval указан, а аргумент end нет, повторяющиеся вызовы функции f
* никогда не прекратятся. Если отсутствуют оба аргумента, interval и end,
* тогда функция f будет вызвана только один раз, через start миллисекунд.
* Если указан только аргумент f, функция будет вызвана немедленно, как если бы
* в аргументе start было передано число 0. Обратите внимание, что вызов invokeQ
* не блокируется: она сразу же возвращает управление.
*/
function invoke(f, start, interval, end) {
if (!start) start =0; //По умолчанию через 0 мс
if (arguments.length <= 2) // Случай однократного вызова
setTimeout(f, start); // Вызвать 1 раз через start мс.
else { // Случай многократного вызова
setTimeout(repeat, start); // Начать вызовы через start мс
function repeat() { // Планируется на вызов выше
var h = setlntervalQ, interval); // Вызывать f через interval мс.
// Прекратить вызовы через end мс, если значение end определено
if (end) setTimeout(function() { clearlnterval(h); }, end);
}
}
}
По исторически сложившимся причинам в первом аргументе методам setTimeout()
и setlnterval()
допускается передавать строку. В этом случае строка будет интерпретироваться (как с применением функции eval()
) через указанный интервал, времени. Спецификация HTML5 (и все броузеры, кроме IE) допускает передавать методам setTimeout()
и setlnterval()
дополнительные аргументы после первых двух. Все эти дополнительные аргументы будут передаваться функции, вызов которой планируется этими методами. Однако если требуется сохранить совместимость с IE, эту возможность использовать не следует.
Если методу setTimeout()
указать величину интервала 0 миллисекунд, указанная функция будет вызвана не сразу, а «как только такая возможность появится, т. е. как только завершат работу все обработчики событий.
- 14.3.3. Интервальные таймеры: setitimer() и getitimer()
- Глава 10 Таймеры и управление временем
- Аппаратные часы и таймеры
- Таймеры
- Таймеры ожидания
- 18.2.2. Интервальные таймеры
- 6.2.4. Таймеры, задержки и буферы
- Часы и таймеры
- Часы, таймеры и периодические уведомления
- Таймеры, посылающие сигналы
- Таймеры, создающие потоки
- Глава 3 Часы, таймеры и периодические уведомления