пятница, июня 20, 2014

Идиоматический асинхронный линеаризированный javascript на node.js с использованием Q

Если не принять мер, рано или позно callback-hell в javascript начнет отравлять вашу жизнь и вы будете искать способ линеаризации кода для композиции асинхронных и синхронных вызовов.
Лично я для линеарилизации асинхронных вызовов предпочитаю использовать библиотеку Q. Впрочем, у всех подобных библиотек примерно одинаковая семантика. Рассмотрим, к примеру, гипотетическую последовательность действий при регистрации пользователя:
1. Регулярными выражениями проверяем что e-mail правилен (sync)
2. Проверяем что пароль сложен (sync)
3. Проверяем существует ли пользователь с таким именем в базе (async)
4. Записываем в базу новую учетную запись, если за это время кто-то другой не создал запись (async)
5. Возвращаем сериализованную запись пользователя или ошибку


Какие выводы можно сделать из вышеприведенного кода?
1. В асинхронной функции создается Q.defer(), возвращается promise, в нужный момент вызываются reject с ошибкой или resolve с результатом выполнения.
2. В синхронной функции возвращается значение или кидается ошибка.
3. Обработку fail имеет смысл централизовать.
4. Поскольку в следующий .then аргументом передается результат выполнения предыдущего, то в этих случаях оберток не требуется (createUser передает user в serializeUser)

Мой список блогов