将内部的失败/拒绝传递给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,但我会编辑这个答案,如果它有错误:)