JavaScript | setTimeout()

JavaScript | setTimeout()

Короткая справка по setTimeout()

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

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

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

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

Метод setTimeout() должен возвращать значение, возвращаемое этапами инициализации таймера, передавая им аргументы метода, объект, на котором реализован метод, для которого выполняется алгоритм (объект Window или WorkerGlobalScope) в качестве «контекста метода«, и флаг «повторения» установлен в значение false.

 

Минимальный набор для работы.

Мы создадим две функции. Первая будет ДЕЛАТЬ, а вторая будет ЗАПУСКАТЬ ПО ТАЙМЕРУ первую. По сути вторая ничего сама не делает — никак не влияет на данные. Вторая функция обеспечивает всей программе ОТЛОЖЕННОСТЬ (АСИНХРОННОСТЬ), которую не может дать интерпретатор кода JavaScript.

То есть setTimeout — это не фундаментальная конструкция стандарта ECMAScript, по которому работает JavaScript. В нашем случае setTimeout — это просто «Браузерный API» — это функция браузерного прикладного интерфейса программирования «WindowOrWorkerGlobalScope mixin», которая входит в состав стандарта HTML, описанного в консорциуме «whatwg.org». Миксин WindowOrWorkerGlobalScope предназначен для использования API, которые должны быть представлены в объектах Window и WorkerGlobalScope.

 

Пример работы setTimeout() с таймером и функцией.

Напишем первую функцию nowDate, которая будет выводить в консоль текущую дату:

function nowDate () {
   console.log(Date())
}
Функция выводит текущую дату в консоль браузера - JavaScript
Функция выводит текущую дату в консоль браузера — JavaScript

Мы ОБЪЯВИЛИ функцию, но НЕ ЗАПУСТИЛИ её. (НЕ ВЫЗВАЛИ)

При попытке ВЫЗОВА функции nowDate() в консоль браузера будет немедленно выведена текущая дата. Мы пишем название функции и ставим круглые скобки — так мы ВЫЗЫВАЕМ её выполнение.

nowDate()
Вызвали функцию с круглыми скобками - JavaScript
Вызвали функцию с круглыми скобками — JavaScript

 

Напишем вторую функцию sleep5sec, которая будет совершать ОТЛОЖЕННЫЕ действия по заданному таймеру:

function sleep5sec () {
   setTimeout(nowDate, 5000)
}
Функция вызывает другую функцию через 5 секунд - JavaScript
Функция вызывает другую функцию через 5 секунд — JavaScript

В этой функции мы будем на 5 секунд откладывать выполнение выведения текущей даты. То есть мы будем на 5 секунд ОТКЛАДЫВАТЬ ВЫЗОВ функции nowDate, которую ОБЪЯВИЛИ ранее.

В setTimeout() нам нужно передать два параметра:

  1. Ссылку на функцию обратного вызова (в нашем случае это nowDate). Просто название функции БЕЗ КРУГЛЫХ СКОБОК, потому что круглые скобки будут немедленно её вызывать и ТАЙМЕР НЕ БУДЕТ РАБОТАТЬ.
  2. Число миллисекунд, через которое передаваемая функция будет вызвана. В 1 секунде 1000 миллисекунд.

 

ВНИМАНИЕ!!! В setTimeout() мы передаём ТОЛЬКО ССЫЛКУ НА ФУНКЦИЮ. Круглые скобки НЕ НУЖНЫ. Убираем круглые скобки

Если в setTimeout() передать название функции с круглыми скобками, то она будет немедленно ВЫЗВАНА. Никакой асинхронности не будет заметно.

 

Что мы имеем на данный момент?

Сейчас у нас есть две функции (две небольшие программки). Их имена:

  1. nowDate
  2. sleep5sec

nowDateПри вызове. Мгновенно вернёт результат (данные).

sleep5secПри вызове. Подождёт 5 секунд и вернёт результат (данные).

 

Что делать после объявления функций?

Интерпретатор получил наши функции — маленькие программы. Он знает как их будет выполнять.

Теперь нам нужно вызвать ту функцию, которая возвращает ОТЛОЖЕННЫЕ данные … Нужно вызвать ту функцию, которая знает как выполнять другую функцию с временной задержкой …  Нужно вызвать ту функцию, которая в своём теле содержит setTimeout().

Мы вызываем sleep5sec(). Пишем название нашей функции и СТАВИМ КРУГЛЫЕ СКОБКИ.

sleep5sec()
Через 5 секунд выполняется функция nowDate
Через 5 секунд выполняется функция nowDate

 

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

JavaScript | setTimeout() | Как передать параметры в функцию-обработчик?

Стандарт HTML (whatwg) — Таймеры — https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#timers

Стандарт HTML (whatwg) — Миксин WindowOrWorkerGlobalScopehttps://html.spec.whatwg.org/multipage/webappapis.html#windoworworkerglobalscope-mixin

Стандарт HTML (whatwg) — Метод setTimeout()https://html.spec.whatwg.org/multipage/timers-and-user-prompts.html#dom-settimeout

Стандарт ECMAScript — конструктор Date()https://tc39.es/ecma262/#sec-date-constructor

Стандарт ECMAScript — Функции — https://tc39.es/ecma262/#sec-function-objects