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

