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

и если вы пишете интерфейс, подразумевающий получение функции обратного вы -
       зова, я настоятельно рекомендую придерживаться этого соглашения.

       Проклятье о     б р  атных вызовов
          Хотя обратные вызовы позволяют управлять асинхронным выполнением, у них
       есть практический недостаток: они с трудом справляются с ситуацией, когда необ­
       ходимо ждать завершения нескольких процессов перед продолжением. Вообразите
       случай, когда вы пишете приложение для Node, которое должно получить содержи­
       мое трех разных файлов, а затем выждать 60 секунд, прежде чем объединить содер­
       жимое этих файлов и записать в четвертый файл.
                           s
       const  fs  =  require ( ' f ' )  ;
       fs . readFile ( ' a . t xt ' ,   function ( e rr,  dataA)  {
                                  r
           if ( e rr)  console . e rror ( e r ) ;
                           t
           fs . readFile ( ' b  . t x ' ,   func i on ( e rr ,  dataB)
                                   t
               if ( e rr)  console . error ( e rr) ;
               f s . readFile ( ' c . t x ' ,   func i on ( e rr,  dataC )
                               t
                                       t
                   i f ( e rr)  console . e rror ( e rr) ;
                   setTimeout ( f unction ( )    {
                       fs . writeFile ( ' d  . t x ' ,   dataA+dataB+dataC,  function ( e rr)  {
                                        t
                                                 r
                          i f ( e rr)  console . e rror ( e r ) ;
                       } )   ;
                   } ,  6 0 * 1 0 0 0 ) ;
               } ) ;
           } )   ;
       } )   ;
          Программисты назьmают это п р оклятьем обратных вызовов (callback hell). Его признаком
       является треугольная форма блоков кода, образованных вложенными фигурными скобками.
       Проблема обработки ошибок здесь стоит еще острее. Все, что мы делаем в этом примере, - это
       регистрируем ошибки, но если бы мы попьттались сгенерировать исключение, то были бы не­
       приятно удивлены. Рассмотрим следующий упрощенный пример.
       const  fs   =  require ( ' f s ' ) ;
       function  readSketchyFile ( )    {
           try  {
               fs . readFile ( ' does_not _ exist . txt ' ,   function ( e rr,  data )  {
                   if ( e rr)  throw  err;
               } )   ;
             catch ( e rr)  {
                        g
               соnsоlе . l о ( ' Внимание :  возникли  небольшие  проблемы,  продолжаем
                         ы
       вьmолнение  программ ' )  ;

                   i
       readSketchyF l e  ( ) ;
   229   230   231   232   233   234   235   236   237   238   239