type tag script mdn defer async javascript asynchronous promise deferred q

javascript - tag - Async cascada equivalente con Q



script tag module (1)

Si está utilizando Q.defer generalmente está haciendo algo mal.

var findByEmail = Q.nbind(User.findByEmail, User); var updateEmail = Q.nbind(User.updateEmail, User); var updateName = Q.nbind(User.updateName, User); //later on... exports.settingsAccountPOST = function (req, res) { findByEmail({ email: req.body.email }) .then(function (user) { if (!user) { return updateEmail({ userId: req.session.user.id, email: req.body.email }); } }) .then(function () { return updateName({ userId: req.session.user.id, name: req.body.name }) }) .then(function () { res.redirect("/account"); }) .catch(function(e){ //Handle any error }); };

Tengo una sola página que es una página de configuración de cuenta. En él, permito a mis usuarios actualizar su avatar (si han adjuntado una imagen), cambiar su correo electrónico (si se ha cambiado desde el original) y cambiar su nombre y contraseña.

En este momento, estoy usando el método de waterfall asincronización, pero estoy cambiando asincrón por Q ya que prefiero la sintaxis (y api). Me pregunto si esta es la forma en que debería usar Q en reemplazo de la cascada de asincronización.

Estoy haciendo algo como esto:

exports.settingsAccountPOST = function(req, res) { var doesEmailExist = function() { var deferred = Q.defer(); User.findByEmail({ email: req.body.email }, function(err, user) { if (err) { deferred.reject(err); } else { deferred.resolve(user); } }); return deferred.promise; }; var updateEmail = function(email) { var deferred = Q.defer(); User.updateEmail({ userId : req.session.user.id, email : req.body.email }, function(err, updated) { if (err) { deferred.reject(err); } else { deferred.resolve(updated); } }); return deferred.promise; }; var updateName = function() { var deferred = Q.defer(); if (req.body.name) { User.updateName({ userId: req.session.user.id, name: req.body.name }, function(err, updated) { if (err) { deferred.reject(err); } else { deferred.resolve(updated); } }); return deferred.promise; } }; doesEmailExist().then(function(email) { if (!email) { return(updateEmail(email)); } }).then(function() { return(updateName()) }).then(function() { res.redirect(''/account'') }); };

Diga que hay un error con la dirección de correo electrónico que se está utilizando. ¿Hay alguna manera de "pasarlo" a la llamada final? Caso de uso: actualicé la contraseña correctamente, pero la actualización del correo electrónico no funcionó, por lo que quiero mostrarle al usuario una actualización de la sesión diciéndole que actualizó su contraseña correctamente, pero hubo un problema con la actualización de su correo electrónico.

Estaba buscando en los documentos y parece que podría necesitar usar:

.fin(function () { });

¿Es esto correcto? Si es así, ¿en qué debería estar pasando eso? Simplemente presione hacia un objeto el error que ocurrió dentro de la cadena y luego revise todos los errores para mostrarlos al usuario. ¿O simplemente regresa inmediatamente y muestra el error?