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 . Асинхронное программирование

