[英]Async waterfall equivalent with Q
我有一個頁面,這是一個帳戶設置頁面。 在其中,我允許我的用戶更新他們的頭像(如果他們已附加圖像),更改他們的電子郵件(如果它已從原始更改),並更改他們的名稱和密碼。
現在,我正在使用async的waterfall
方法,但我更換了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
});
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.