HTML | Таймеры

HTML | Таймеры

Методы setTimeout() и setInterval() позволяют авторам планировать обратные вызовы на основе таймера.

 

Для веб-разработчиков (не нормативно)

id = self.setTimeout(handler [, timeout [, …arguments ] ])

Планирует тайм-аут для запуска обработчика handler по истечении тайм-аута timeout в миллисекундах. Любые аргументы arguments передаются напрямую обработчику handler.

id = self.setTimeout(code [, timeout ])

Планирует тайм-аут для компиляции и запуска кода code по истечении тайм-аута timeout в миллисекундах.

self.clearTimeout(id)

Отменяет тайм-аут, установленный с помощью setTimeout() или setInterval(), идентифицированный идентификатором id.

 

id = self.setInterval(handler [, timeout [, …arguments ] ])

Планирует тайм-аут для запуска обработчика handler каждые миллисекунды тайм-аута timeout. Любые аргументы передаются напрямую обработчику handler.

id = self.setInterval(code [, timeout ])

Планирует тайм-аут для компиляции и запуска кода code каждые миллисекунды тайм-аута timeout.

self.clearInterval(id)

Отменяет тайм-аут, установленный с помощью setTimeout() или setInterval(), идентифицированный идентификатором id.

 

 

Примечание

Таймеры могут быть вложенными; однако после пяти таких вложенных таймеров интервал должен составлять не менее четырех миллисекунд.

 

Примечание

Этот API не гарантирует, что таймеры будут работать точно по расписанию. Ожидаются задержки из-за загрузки ЦП, других задач и т. д.

 

Объекты, реализующие миксин WindowOrWorkerGlobalScope, имеют карту активных таймеров (map of active timers), которая является картой и изначально пуста. Каждый ключ на этой карте — это идентификатор таймера, а каждое значение — это DOMHighResTimeStamp, представляющий время истечения срока действия этого таймера.

 

Примечание

Для записей, помещённых в карту активных таймеров шагами инициализации таймера, т. е. setTimeout() и setInterval(), ключами являются числа. Для других спецификаций, в которых используются алгоритм шагов выполнения после тайм-аута, идентификатор представляет собой уникальное нечисловое значение. clearTimeout() и clearInterval() воздействуют только на таймеры с числовыми ключами, но все таймеры участвуют в расчёте срока простоя и сбрасываются, когда соответствующий глобальный объект уничтожается.

 

Шаги метода setTimeout(handler, timeout, …arguments) должны возвращать результат выполнения шагов инициализации таймера с учетом объекта контекста this, обработчика handler, тайм-аута timeout, аргументов arguments и false.

Шаги метода setInterval(handler, timeout, …arguments) должны возвращать результат выполнения шагов инициализации таймера с учетом объекта контекста this, обработчика handler, тайм-аута timeout, аргументов arguments и true.

Шаги методов clearTimeout(id) и clearInterval(id) предназначены для удаления карты активных таймеров[id] объекта контекста this.

 

Примечание

Поскольку clearTimeout() и clearInterval() очищают записи из одной и той же карты, любой метод может использоваться для очистки таймеров, созданных setTimeout() или setInterval().

 

Шаги инициализации таймера (timer initialization steps), учитывая глобальную область объекта global WindowOrWorkerGlobalScope, обработчик handler — строковый или функциональный Function, тайм-аут timeout — числа, список аргументов arguments, логическое значение повторения repeat и, необязательно (и только если повторение repeat истинно) число, предыдущего идентификатора previousId, таковы:

1. Пусть thisArg будет глобальным объектом global, если это объект WorkerGlobalScope; в противном случае пусть thisArg будет WindowProxy, соответствующим global.

2. Если был задан предыдущий идентификатор previousId, пусть идентификатор id будет предыдущим идентификатором — previousId; в противном случае пусть id будет целым числом, определяемым реализацией, которое больше нуля и еще не существует в карте активных таймеров глобального global.

3. Если текущая выполняемая задача цикла событий окружающего агента является задачей, созданной этим алгоритмом, то пусть уровень вложенности nesting level будет уровнем вложенности таймера задачи. В противном случае пусть уровень вложенности nesting level равен нулю.

Примечание

Уровень вложенности таймера задачи используется как для вложенных вызовов setTimeout(), так и для повторяющихся таймеров, созданных setInterval(). (Или, на самом деле, для любой комбинации этих двух.) Другими словами, он представляет вложенные вызовы этого алгоритма, а не конкретного метода.

4. Если таймаут timeout меньше 0, то установите таймаут timeout равным 0.

5. Если уровень вложенности nesting level больше 5, а таймаут timeout меньше 4, установите время ожидания timeout равным 4.

6. Пусть callerRealm будет текущей Записью Области (Realm Record), а calleeRealm будет соответствующей Областью глобального global.

7. Пусть инициирующий сценарий initiating script будет активным сценарием.

8. Утверждено: инициирующий скрипт initiating script не является null, так как этот алгоритм всегда вызывается из какого-то скрипта.

9. Пусть task будет задачей, которая выполняет следующие подшаги:

9.1. Если id не существует в карте активных таймеров глобального global, прервите эти шаги.

9.2. Если обработчик handler является функцией Function, то вызовите переданные обработчику handler аргументы arguments с обратным вызовом, значение которого установлено в thisArg. Если это вызывает исключение, перехватите его и сообщите об исключении.

9.3. Иначе:

9.3.1. Утверждено: обработчик handler является строкой.

9.3.2. Выполните HostEnsureCanCompileStrings(callerRealm, calleeRealm). Если это вызывает исключение, перехватите его, сообщите об исключении и прервите эти шаги.

9.3.3. Пусть объект настроек settings object будет соответствующим объектом настроек глобального global.

9.3.4. Пусть базовый URL-адрес base URL будет базовым URL-адресом initiating script.

9.3.5. Утверждено: базовый URL-адрес base URL не является null, поскольку инициирующий сценарий initiating script является классическим сценарием или сценарием модуля JavaScript.

 

9.3.6. Пусть параметры выборки fetch options будут параметрами выборки сценария, чей криптографический одноразовый номер инициирует криптографический одноразовый номер параметров выборки инициализирующего сценария initiating script, метаданные целостности представляют собой пустую строку, метаданные синтаксического анализатора являются «not-parser-inserted«, режим учётных данных является режимом учётных данных параметров выборки инициализирующего сценария initiating script и политику рефёрера является политикой рефёрера параметров выборки инициализирующего сценария initiating script.

Примечание

Действие этих опций гарантирует, что компиляция строки, выполняемая функциями setTimeout() и setInterval(), ведёт себя так же, как и компиляция, выполняемая функцией eval(). То есть выборка скрипта модуля через import() будет вести себя одинаково в обоих контекстах.

9.3.7. Пусть сценарий script будет результатом создания классического сценария с заданным обработчиком handler, объектом настроек settings object, базовым URL-адресом base URL и параметрами выборки fetch options.

9.3.8. Запустите классический скрипт script.

9.4. Если id не существует в карте активных таймеров глобального объекта global, прервите эти шаги.

Примечание

Возможно, он был удален авторским кодом в обработчике, вызывающем clearTimeout() или clearInterval().

9.5. Если повторение repeat равно true, то снова выполните шаги инициализации таймера, учитывая глобальный объект global, обработчик handler, время ожидания timeout, аргументы arguments, значение true и идентификатор id.

9.6. В противном случае удалите карту активных таймеров[id] глобального global.

10. Увеличить уровень вложенности nesting level на единицу.

11. Установите уровень вложенности таймера (timer nesting level) задачи task на уровень вложенности nesting level.

12. Пусть шаг завершения completionStep будет шагом алгоритма, который ставит в очередь глобальную задачу в источнике задачи таймера (timer task source), который задан global для запуска задачи task.

13. Выполнение шагов после тайм-аута с заданным global, «setTimeout/setInterval«, тайм-аутом timeout, шагом завершения completionStep и идентификатором id.

14. Вернуть id.

 

Примечание

Преобразование аргументов, как определено в Web IDL (например, вызов методов toString() для объектов, переданных в качестве первого аргумента), происходит в алгоритмах, определенных в Web IDL, до вызова этого алгоритма.

 

Пример

Так, например, следующий довольно глупый код приведет к тому, что журнал будет содержать «ОДИН ДВА»:

var log = »;
function logger(s) { log += s + ‘ ‘; }

setTimeout({ toString: function () {
setTimeout(«logger(‘ONE’)», 100);
return «logger(‘TWO’)»;
} }, 100);

 

Пример

Чтобы запускать задачи продолжительностью несколько миллисекунд подряд без каких-либо задержек, при этом уступая место браузеру, чтобы избежать голодания пользовательского интерфейса (и чтобы браузер не убивал скрипт из-за перегрузки ЦП), просто поставьте в очередь следующий таймер перед выполнением работы:

function doExpensiveWork() {
var done = false;
// …
// эта часть функции занимает до пяти миллисекунд
// установите значение true, если мы закончили
// …
return done;
}

function rescheduleWork() {
var id = setTimeout(rescheduleWork, 0); // заранее запланировать следующую итерацию
if (doExpensiveWork())
clearTimeout(id); // очистить тайм-аут, если он нам не нужен
}

function scheduleWork() {
setTimeout(rescheduleWork, 0);
}

scheduleWork(); // ставит в очередь задачу, чтобы сделать много работы

 

Чтобы выполнить шаги после тайм-аута (run steps after a timeout), учитывая глобальную переменную global  WindowOrWorkerGlobalScope, строку orderingIdentifier, число в миллисекундах milliseconds, набор шагов завершении completionSteps и необязательное значение timerKey:

1. Утверждено: если задан timerKey, то вызывающим объектом этого алгоритма являются шаги инициализации таймера. (Другие спецификации не должны передавать timerKey.)

2. Если timerKey не указан, установите для него новое уникальное нечисловое значение.

3. Пусть startTime будет текущим временем высокого разрешения.

4. Установите карту активных таймеров[timerKey] глобального global на startTime плюс миллисекунды milliseconds.

5. Параллельно выполните следующие шаги:

5.1. Если global является объектом Window, подождите, пока связанный Document глобального global не станет полностью активным ещё milliseconds миллисекунды (не обязательно последовательно).

5.2. В противном случае global является объектом WorkerGlobalScope; подождите, пока не пройдет миллисекунды milliseconds, когда рабочий процесс не будет приостановлен (не обязательно последовательно).

5.3. Подождите, пока все вызовы этого алгоритма, которые имели тот же global и orderingIdentifier, который начался до этого, и чьи миллисекунды milliseconds равны или меньше этого, не завершатся.

5.4. При необходимости подождите еще один период времени, определённый реализацией.

Примечание

Это предназначено для того, чтобы пользовательские агенты могли заполнять тайм-ауты по мере необходимости для оптимизации энергопотребления устройства. Например, некоторые процессоры имеют режим пониженного энергопотребления, в котором детализация таймеров снижена; на таких платформах пользовательские агенты могут замедлять таймеры, чтобы соответствовать этому расписанию, вместо того, чтобы требовать от процессора использования более точного режима с соответствующим более высоким энергопотреблением.

5.5. Выполните шаги завершения completionStep.

5.6. Если timerKey не является числовым значением, удалите карту активных таймеров[timerKey] глобального global.

 

Примечание

Выполнение шагов после тайм-аута предназначено для использования другими спецификациями, которые хотят выполнить код, предоставленный разработчиком, после тайм-аута, предоставленного разработчиком, аналогично setTimeout(). (Обратите внимание, однако, что он не имеет поведения вложенности и фиксации, как setTimeout().) Такие спецификации могут выбирать orderingIdentifier, чтобы гарантировать упорядочение в пределах тайм-аутов их спецификации, не ограничивая упорядочение в отношении тайм-аутов других спецификаций.

 

Информационные ссылки

HTML | Оглавление

Стандарт HTMLhttps://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers