我是这个延迟的新手,但发现了一个低点。我仍在寻找一种方法来“保存”以下代码中的冗余 fail -> login
:
$.when(loginHandler.findLegacyUser(username, password))
.done((doc:imports.ILegacyUser) => {
$.when(loginHandler.migrateUser(doc, password))
.done((doc:model.IUser) => {
req.feedback.add("Your existing account was migrated successfully");
req.session.username = doc.username;
res.redirect('/members/');
}).fail((err) => {
login(req, res);
});
}).fail((err) => {
login(req, res);
});
我希望从命名中可以清楚地看出它的作用。因此,无论何时迁移失败,我们都希望执行正常的 login
。要迁移,我们首先必须查找 LegacyUser
,如果它是 null
,则 migrateUser(doc, password)
将会失败。
我喜欢做的是以某种方式将内在的拒绝传递给外在的 promise 。
最佳答案
我不完全确定我理解你的意思,但我猜你只需要一个失败处理程序,并且代码应该执行它,而不管被拒绝的是外部 promise 还是内部 promise 。
在这种情况下,您应该提供自己的 promise 并将这两个调用包装在一个将返回此 promise 的方法中。然后您可以将已解决和已拒绝的处理程序附加到此 promise 。
代码:
var migrateWhenLegacyUser = function(username, password){
var deferred = $.Deferred();
$.when(loginHandler.findLegacyUser(username, password))
.done((doc:imports.ILegacyUser) => {
$.when(loginHandler.migrateUser(doc, password))
.done((doc:model.IUser) => {
deferred.resolve(doc);
}).fail((err) => {
deferred.reject(req, err);
}
);
}).fail((err) => {
deferred.reject(req,err);
}
);
return deferred;
}
// usage example
migrateWhenLegacyUser("user","password").done((doc) => {
req.feedback.add("Your existing account was migrated successfully");
req.session.username = doc.username;
res.redirect('/members/');
}).fail((req, err) => {
login(req, res)
});
关于jquery - 将内部失败/拒绝传递给 jquery 中的外部 promise 以避免代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21246180/