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
   225   226   227   228   229   230   231   232   233   234   235