Обработка ошибок при асинхронном выполнении в JavaScript?
Асинхронная функция потому и асинхронная, что возврат из неё (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.
Не совсем ответ на вопрос, но лично мне удобнее console.log() вместо alert()