Page 240 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 240

Метод on класса EventEmitter как раз и позволяет прослушивать сообщения о со­
       бытии. В этом примере мы предоставляем обратный вызов для каждого события tick.
       Если  i c k   не О, мы выводим его. Затем происходит вызов метода go, который запу­
            t
       скает обратный отсчет. Когда обратный  отсчет заканчивается, мы выводим  строку
       " С тарт ! " . Конечно, мы могли бы поместить вывод " С тарт ! "    в обработчик события
       t i ck, но так мы подчеркнули различие между событиями и обязательствами.
          Результат,  определенно,  более  подробен,  чем  наша  первоначальная  функция
       countdown, и мы получили намного больше функциональных возможностей. Теперь
       у нас есть полный контроль над регистрацией событий при обратном отсчете и обя­
       зательство, выполняемое при завершении обратного отсчета.
          Мы все еще имеем в запасе одну задачу - мы не решили проблему суеверного
       экземпляра  Countdown, продолжающего обратный отсчет после  3 , даже при том что
                                                                 1
       обязательство было отклонено.
       const  с  =  new  Countdown ( l 5 ,   true )
           . on (  t ic ' ,   function (  )    {   / /  заметьте,  мы можем  "сцепить "  вызов  ' оп '
                               i
                   k
               '
               i f ( i > O )   console . l og ( i   +  ' . . .   ) ;
                                          '
           } )   ;
           (
       с  . go  )

           . then ( function ( )
               console . log ( ' С тарт !  ' )  ;
           } )
           . c atch ( function ( e r r )    {
               console . e rror ( e rr . m essag ) ;
                                      e
       } )
          Мы получим сообщение о событии tick даже если будет достигнуто значение О
       (хотя и не выводим информации о нем). Решение этой  проблемы немного затруд­
       нительно, поскольку мы уже создали все нужные нам интервалы времени. Конечно,
       здесь мы могли бы просто "смошенничать" и немедленно прервать работу, если су­
       еверный таймер создается для отсчета  1 3   или более секунд, но это противоречило
       бы задаче упражнения! Для решения данной проблемы, поскольку мы обнаружили,
       что не можем без этого продолжать, мы должны будем очистить все ожидающие об­
       работки интервалы времени.
                                                      e
       const  EventEmitter  =  require ( ' events ' )   . E ventEmitt r ;
       class  Countdown  extends  EventEmitter  {
           constructor ( s econds ,  superstit ious )
               super ( ) ;
               this . seconds   =  seconds ;
                                   1  ! s uperstitious ;
               this . superstitious  =
             (
           go  )    {


                                                                 Обязательства   243
   235   236   237   238   239   240   241   242   243   244   245