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

возможно. Остается только  модифицировать нашу функцию так,  чтобы использо­
       вать метод Promise . all.

       function*  theFutureisNow ( )
           const  data  =  yield  Promise . a ll ( [
               nfc l l   ( f s .   readFi l e ,    '  а  .   tx ' ) ,
                  a
                                       t
                                       t
               nfcall  ( f s . readFile,  ' b  . t x ' ) ,
                   l
               nfca l   ( f s . r eadFi e ,    '  с  .   tx ' ) ,
                                       t
                              l
           ] ) ;
           yield  ptimeout ( 6 0 * 1 0 0 0 ) ;
           yield  nfcall ( f s . writeFile,  ' d  . t x ' ,   data [ O ] +data [ l ] +data [ 2 ] )  ;
                                          t
          Обязательство, возвращенное методом Prom s e . all, представляет собой массив,
                                                  i
       содержащий значение состояния  выполнения каждого обязательства в  порядке их
       расположения в массиве. Даже при том, что файл  с  . txt вполне может быть прочитан

                                          [
       прежде, чем файл  .   txt, элемент data  О ]   будет все еще хранить содержимое  .   txt,
                                                                              а
                        а

       а da ta [ 2 ]   - содержимое с  . txt.
          Из этого раздела вам уже должно было стать понятно, что в основе всего лежит
                         a
                    i
                                                                  )
       не метод  Prom s e .  l l   (хотя это и весьма удобный инструмент ,   а то, что следует
       учитывать,  какие именно части вашей  программы могут  быть выполнены парал­
       лельно, а какие не могут. В этом примере вполне можно даже запустить интерваль­
       ный таймер параллельно с чтением файла: все это зависит от задачи, которую вы
       пытаетесь решить. Если важно, чтобы эти три файла были прочитаны, затем про­
       шло 60 секунд, а затем результат их объединения записан в другой файл, то мы уже
       имеем то,  что хотим. С другой стороны,  нам  может  понадобиться, чтобы эти  три
       файла были прочитаны не ранее,  чем через 60 секунд, а результат был записан в чет­
       вертый файл - в этом случае нам нужно переместить установку интервала в метод
       Promise . all.
       Не п и шите собствен н ых пускателей генераторов

          Хотя написание собственного пускателя генератора, как это было сделано с grun,
       является хорошим упражнением, в него следовало бы внести много нюансов и усо­
       вершенствований. Лучше не изобретать колесо. П у скатель генератора со полноце­
       нен и надежен. Если вы создаете веб-сайты, вам может иметь смысл изучить Коа, ко­
       торый предназначен для работы с со и позволяет писать веб-обработчики, используя
       yield, как в функции theFutureisNow.

       Обработка исключений в пускателях генераторов
          Другое важное преимущество пускателей генератора состоит в том, что они до­
       пускают возможность обработки исключений с помощью блоков try/catch.  Пом­
       ните, что при использовании функций обратного вызова и обязательств обработка


       250      Глава  14. Асинхронное программирование
   242   243   244   245   246   247   248   249   250   251   252