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 ( ) ;

