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

обязательство будет выполнено, то оно  будет выполнено только  однократно; если
       оно будет отклонено, то тоже только однажды. Как только обязательство было либо
       выполнено, либо отклонено, оно считается завершенным (settled).
          Еще одно преимущество обязательств по сравнению с обратными вызовами за­
       ключается в том, что, обязательства - это обычные объекты, которые легко можно
       передать в другие функции. Если вы хотите начать асинхронный процесс, но пред­
       почли  бы, чтобы  результаты обрабатывал кто-то  другой,  можете  просто  передать
       обязательство ему (это походило бы на передачу пейджера для резервирования сто­
       лика вашему другу - ресторан не будет  возражать,  ему безразлично, кто  именно
       получит столик, если количество посетителей за ним останется прежним).

       Создан и е   обязательств

          Создание обязательств является простым делом: вам нужно создать новый экзем­
       пляр объекта Promise с функцией, которой передаются две функции обратного вы­
                                   j
       зова resolve (выполнено) и re e ct (отклонено) (я предупреждал вас, что обязатель­
       ства не спасают от обратных вызовов!). Давайте возьмем нашу функцию countdown,
       параметризируем ее (чтобы не зацикливаться только на 5-секундном обратным от­
       счете) и  сделаем так, чтобы она возвратила обязательство, когда обратный отсчет
       начнется.

       function  countdown ( s econds )
           return  new  Promise ( function  r esol ve ,  rej ect)  {
                                     (
               for ( l et  i=seconds ;  i> O ;   i-- )
                                   =
                   setTimeout ( f unction ( )    {
                       if ( i > O )   console . l og ( i   +  ' . .  .  ' )  ;
                       else  resolve ( c onsole . l og ( " C тapт ! " )  )  ;
                      ( s econds i )   * 1 0 0 0 ) ;
                             -
                   }  ,
           } )   ;


          Прямо сейчас эта функция не очень гибка. Дело в том, что нам не всегда требуется
       вербальный вывод, более того, нам не всегда требуется выводить что-то на консоль.
       Такой подход  совершенно  не годится,  если мы планируем выводить информацию
       на веб-странице, модифицируя соответствующий элемент DOM с помощью нашей
       функции обратного отсчета. Но это только начало ... и демонстрация создания обя­
       зательств. Обратите внимание, что resol ve (как и  rej ect) является функцией. Вы
       могли бы подумать "Ха-ха! Я могу вызвать resolve несколько раз и нарушить ... обя­
       зательство обязательств': Вы действительно можете вызывать функции resol ve или
       rej e ct многократно или даже попеременно ... но будет учитываться только их пер­
       вый вызов. Обязательство гарантирует, что кто бы его ни использовал, он получит





                                                                 Обязатеnьства   239
   231   232   233   234   235   236   237   238   239   240   241