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

фактически. Этот принцип применим ко всем асинхронным методикам, а не только
       к обратным вызовам.

       Передач а   ошибок функциям обратного в ы з ова
          В некий момент роста популярности среды Node было принято соглашение об ис­
       пользовании первого аргумента в функции обратного вызова для передачи ей ошибок
       (error-first callback). Поскольку ,  как мы вскоре увидим, механизм обратных вызовов за­
       трудняет обработку исключений, нужен стандартный способ сообщения о проблеме,
       возникшей в момент запуска функции обратного вызова.  Соглашение подразумевает
       использование первого аргумента функции обратного вызова для доступа к объекту
                                            l
       ошибки. Если значение этого аргумента nu l   или undefined, никакой ошибки не было.
          Всякий раз, когда вы имеете дело с функцией обратного вызова с первым аргу­
       ментом для передачи ошибки, первое, что нужно сделать,  - проверить его на на­
       личие ошибки и выполнить соответствующее действие. Рассмотрим попытку чтения
       содержимого файла в Node, приводящую к ошибке, для обработки которой исполь­
       зуется соглашение о передаче ошибок функциям обратного вызова.
       const  fs  =  require ( ' f s  ' ) ;

       const  fname  =  ' m ay_or_ may_not_ex s t . t x ' ;
                                            t
                                      i
       fs . readFile ( fname ,  function ( e rr,  data)  {
                                                                     e
           i f { e rr)  return  console . e rror ( ' Oшибкa  при  чтении  файла  $ { fnam } :  $ { e rr . m e s ­
       sage } ' ) ;
                     g
           console . l o ( ' $ { f name }  содержит :  $ { d ata}  ) ;
                                                 '
       } ) ;
          Первое, что мы делаем в функции обратного вызова, - проверяем переменную
       e r r   на истинность.  Если это так, значит,  при  чтении  файла возникла проблема,
       и мы выводим на консоль сообщение об этом, а затем немедленно выходим (метод
       console . error не возвращает никакого смыслового значения, и мы не используем
       его ни коим образом,  поэтому мы можем все объединить в одном операторе). При
       использовании описанного выше механизма наиболее часто допускаемой ошибкой,
       вероятно, является случай, когда программист, после проверки, а возможно, и выво­
       да сообщения об ошибке, забывает о том, что нужно немедленно выйти из функции.
       Если этого не сделать и позволить функции продолжить выполняться, она будет счи­
       тать, что в момент ее вызова не возникло никаких проблем, соответственно резуль­
       тат работы функции обратного  вызова будет непредсказуем. Разумеется, возможен
       случай, когда в функции обратного вызова предусмотрена специальная ветка, кото­
       рая должна выполняться в случае ошибки. Т о гда после анализа переданного аргу­
       мента на предмет ошибки и ее фиксации можно продолжить выполнение функции.
          Соглашение о передаче ошибок в функцию обратного вызова стало де-факто стан -
       дартом  при разработке программ для Node (когда обязательства не используются),



       236     Глава 14. Асинхронное программирование
   228   229   230   231   232   233   234   235   236   237   238