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

На первый взгляд, все кажется достаточно резонным и не вызывает неодобрения
       у программистов, использующих обработку исключений. Но только это не будет ра­
       ботать. Давайте опробуем эту программу.  Она завершится аварийно, даже при том
       что мы  проявили столько заботы, чтобы гарантировать отсутствие  проблем из-за
                                                            .
       этой почти ожидаемой ошибки. Дело в том, что блоки try  . .   catch работают только
       в пределах одной и той же функции. Блок  r y  . .   catch находится в readSketchyFile,
                                            t
                                                .
       а ошибка возникает в анонимной функции, которую fs . readFile вызывает как функ­
       цию обратного вызова.
          Кроме того, нет никакой гарантии, что функция обратного вызова не будет вы­
       звана несколько раз (или вообще ни разу!). Если при написании программы вы пред­
       полагаете, что она должна вызываться только один раз, в самом языке не предусмо­
       трено никаких средств контроля за этим процессом.
          Эта проблема вполне преодолима, но с распространением асинхронного кода она
       делает написание удобного в сопровождении и безошибочного кода весьма затруд­
       нительным. Вот здесь и пригодятся обязательства.


       Обязательства
          Обязательства1 (promise) пытаются устранить некоторые из недостатков функ­
       ций обратного вызова. Используя обязательства (хотя это и не всегда просто), мож­
       но получить более безопасный и "простой в сопровождении" код.
          Обязательства не заменяют функций обратного вызова; фактически с обязатель­
       ствами вы все еще должны использовать обратные вызовы. Что на самом деле делают
       обязательства, так это гарантируют единообразный и предсказуемый способ обработ­
       ки обратных вызовов, устраняя некоторые из нежелательных неожиданностей и труд­
       но обнаруживаемых ошибок, которые можно получить, используя только функции об­
       ратного вызова.
          Основная идея обязательств проста: когда вы вызываете асинхронную функцию
       на базе обязательства, она возвращает экземпляр объекта Prornis e .  С этим обяза­
       тельством могут случиться только две вещи:  оно может быть  выполнено  (fulfilled)
       (в  случае  успеха)  или  отклонено  (rejected)  (в  случае  неудачи). Вам гарантирует­
       ся, что произойдет только одно из этих событий (обязательство не может сначала
       быть выполнено, а затем отклонено) и  будет получен только  один  результат.  Если

       1 В русскоязычной документации MDN термин promise переведен как обещание. Однако по смыс­
       лу, который вложили в этот термин разработчики языка, - это именно обязательство! Имеется в
       виду,  что создавая обязательство и возвращая его в исходный код, интерпретатор JavaScript обя­
       зуется в  дальнейшем  при наступлении  нужного  события  либо  выполнить его,  либо отклонить.
       Причем только однократно!  Русскоязычный же термин обещание несет на себе некий оттенок не­
       обязательности, который плохо сочетается со строгими рамками работы языка программирования.
       Поэтому в дальнейшем в книге мы будем использовать термин обязательство. К тому же это одно
       из значений английского слова promise. Переводчики документации MDN почему то решили взять
       его самое первое значение. - П р имеч. ред.

       238      Глава 1 4 . Асинхронное программирование
   230   231   232   233   234   235   236   237   238   239   240