Page 230 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 230
Давайте начнем с простого примера использования встроенной функции
setTimeout, которая задерживает запуск программы на указанное количество мил
лисекунд.
(
(
console . log " До таймаута : " + new Date ) ) ;
function f ( ) {
console . l og ( "Пocлe таймаута : " + new Dat ( ) ) ;
e
setTimeout f , 6 0 * 1 0 0 0 ) ; / / одна минута
(
console . l og ( " Э тo произошло после вызова setTimeout ! " ) ;
е
console . l og ( " И это тож ! " ) ;
Если запустить данный пример на консоли (если только вы не очень медленно его
вводите), можно увидеть нечто такое.
До таймаута : Sun Aug 02 2 0 1 5 1 7 : 1 1 : 3 2 GMT-0 7 0 0 ( P acific Daylight Time )
Это произошло после вызова setTimeout !
И это тоже !
После таймаута : Sun Aug 02 2 0 1 5 1 7 : 1 2 : 3 2 GM - 0 7 0 0 ( P acific Daylight Time )
T
При'lина затруднений у новичков кроется в разрыве между линейной природой
кода, который мы пишем, и фактическим выполнением этого кода. Некоторые из нас
хотят (или ожидают), чтобы компьютер выполнял код точно в том порядке, в кото
ром он был написан. Другими словами, мы хотели бы увидеть следующее.
До таймаута : Sun Aug 0 2 2 0 1 5 1 7 : 1 1 : 3 2 GMT-0 7 0 0 ( P acific Daylight Time )
а
После таймаут : Sun Aug 0 2 2 0 1 5 17 : 1 2 : 3 2 GMT-0 7 0 0 ( P acific Daylight Time )
Это произошло после вызова setTimeout !
И это тоже !
Хотеть не вредно . . но от этого код не стал бы асинхронным! Основной момент
.
асинхронного выполнения состоит в том, что оно не должно ничего блокировать.
Поскольку JavaScript имеет однопоточный характер, то если бы мы указали движку
ждать в течение 60 секунд, а затем запустить некоторый код, и сделали бы это син
хронно, то в этот момент ничего бы не работало. Ваша программа просто "зависла"
бы на это время: она перестала бы реагировать на пользовательский ввод, не обнов
ляла бы экран и т.д. У всех нас были подобные случаи, к сожалению. Асинхронная
техника помогает предотвратить данный вид блокировки.
В нашем примере для ясности мы использовали именованную функцию при пе
редаче в setTimeout. Если нет серьезной причины использовать именованную функ
цию, обычно используют анонимную функцию.
setTimeout ( f unction ( ) {
console . l og ( "Пocлe таймаута : " + new Dat ( ) ) ;
e
} , 6 0 * 1 0 0 0 ) ;
Функция setTimeout немного проблематична, поскольку числовой параметр ин
тервала времени является последним аргументом. При использовании анонимных
Обратные вызовы 233

