我有一个页面,它是帐户设置页面。在其中,我允许我的用户更新他们的头像(如果他们附加了图像)、更改他们的电子邮件(如果已更改为原始电子邮件)以及更改他们的名称和密码。
现在,我正在使用异步waterfall
方法,但我将 async 替换为 Q,因为我更喜欢语法(和 api)。我想知道这是否是我应该使用 Q 来代替异步瀑布的方式。
我正在做这样的事情:
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')
});
};
假设使用的电子邮件地址有错误。有没有办法将其“传递”到最终调用?使用案例:正确更新密码,但电子邮件更新不起作用,因此我想向用户显示会话闪存,告诉他们他们已正确更新密码,但更新电子邮件时出现问题。
我正在查看文档,似乎我可能需要使用:
.fin(function () {
});
它是否正确?如果是这样,我应该传递什么?只需将链中发生的错误推送到对象,然后循环所有错误并将其显示给用户?或者直接返回并显示错误?
如果您正在使用Q.defer
你通常做错了什么。
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
});
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)