将内部的失败/拒绝传递给jQuery中的外部承诺,以避免代码重复
我是新来的这个延期的东西,但发现一个低。 我仍然在寻找一种方法来“保存”冗余fail -> login
在以下代码中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)
将会失败。
我喜欢做的是把内在的拒绝以某种方式传递给外在的诺言。
我不完全确定我明白你的意思,但我猜你只想要一个失败处理程序,并且代码应该执行它,而不pipe它是拒绝的外部还是内部的承诺。
在这种情况下,您应该提供您自己的承诺,并将两个调用包装在一个将返回此承诺的方法中。 然后,您可以附加解决和拒绝的处理程序到这个承诺。
码:
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) });
Q帮助了我。 我会build议大家至less在节点后端喜欢Q insted的jQuery。 迁移非常简单。 大部分工作都是开箱即用的,而且这些差异是有据可查的
Q.when(loginHandler.findLegacyUser(username, password)) .then((legacyUser:imports.IBotUser) => { return Q.when(loginHandler.migrateUser(legacyUser, password)); }) .then((doc:userModel.IUser) => { req.feedback.add("Your existing account was migrated successfully"); req.session.username = doc.username; res.send({success: true}); }) .fail((err) => { login(req, res); });
- 尚未testing,但我会编辑这个答案,如果它有错误:)