Асинхронная функция потому и асинхронная, что возврат из неё (return) происходит существенно быстрее, нежели заканчивает выполняться исходный код запущенных изнутри неё операций и callbacks.
Следовательно, обёртывать такую функцию в конструкцию
try-catch бесполезно (когда возврат из функции случился, тогда никакие ошибки ещё не могли произойти — а значит, ловить ещё нечего), и для обработки ошибок поневоле приходится применять передачу их
callback-функциями, а не бросание оператором throw.
Для такой передачи, как правило, применяется первый же параметр
callback-функции, то есть вызов её имеет вид «
callback(err, data)»,
где error — ошибка или null,
а data — данные, передаваемые при отсутствии ошибки. (Параметров с данными может быть несколько.)
Смысл такого порядка, при котором параметр ошибки идёт первым по счёту, заключается в том, что вместо «throw new Error()» используется простой вызов
callback-функции с единственным параметром: «callback(new Error());
return;» — в общем-то, это не слишком-то сложнее, чем throw.
Чтобы соответствовать этому порядку, внутри такой
callback-функции сперва происходит сравнение первого параметра с величиною null (что позволяет при их неравенстве сразу заметить произошедшую ошибку, при необходимости тотчас же обработать её или передать родительской
callback-функции), и лишь затем приступают к обработке данных, полученных через последующие параметры функции.
Я не разделяю мнения
, согласно которому библиотеки таких функций, которые специально предназначены для обработки ошибок в асинхронных функциях, являются кривыми, и сделаны худо, и чрезмерно наполнены, и не могут служить подспорьем. Я держусь противоположного мнения: библиотека
async представляется мне удобным средством для управления асинхронными функциями и вообще, и в частности — для обработки ошибок в них.
Да это и не только моё мнение: мне доводилось ужé
подмечать в январе нынешнего (2012) года, что пакет async вошёл в десятку наиболее используемых модулей для движка Node по свéдениям сайта «The Node Toolbox», основывающимся на статистике пакетного менеджера npm.