2014-01-26 15 views
0

我創建了一個接收用戶憑據並檢查是否可以登錄用戶的功能。 我的函數返回一個承諾,當給出正確的憑證或者被拒絕時應該解決。檢查基於承諾的登錄功能中的所有可能的錯誤

login: function(credentials){ 
      var dfd = $q.defer(); 

      if(!credentials) dfd.reject('No user credentials given'); 
      else if(!credentials.name || !credentials.name.length) dfd.reject('No username given'); 
      else if(!credentials.password || !credentials.password.length) dfd.reject('No password given'); 
      else if(!self.database.hasOwnProperty(credentials.name)) dfd.reject('Unknown user'); 

      else if(credentials.password == self.database[credentials.name].password){     
       dfd.resolve(true); 
      } 

      else{ 
       dfd.reject('Wrong password'); 
      } 

      return dfd.promise; 
     }, 

雖然我的代碼工作,我發現很難閱讀和混亂。

我有2個問題:

  1. 我怎麼可以這樣寫一個更清潔的方式?

  2. 例如,如果沒有輸入名稱,我可以停止執行代碼的其餘部分:

編輯:

一種新的方法:

login: function(credentials){ 

     var dfd = $q.defer(); 
     var self = this; 

     if(!credentials){ 

      dfd.reject('No user credentials given'); 

     } else if(!credentials.name || !credentials.name.length){ 

      dfd.reject('No username given'); 

     } else if(!credentials.password || !credentials.password.length){ 

      dfd.reject('No password given'); 

     } else if(!self.database.hasOwnProperty(credentials.name)){ 

      dfd.reject('Unknown user'); 

     } else if(credentials.password == self.database[credentials.name].password){ 

      self.name = sessionStorage.name = credentials.name; 
      self.email = sessionStorage.email = self.database[credentials.name].email; 

      if(credentials.remember){ 
       localStorage.name = credentials.name; 
       localStorage.email = self.database[credentials.name].email; 
      } 

      dfd.resolve(true); 

     } else{ 

      dfd.reject('Wrong password'); 
     } 

     return dfd.promise; 
+0

個人而言,我發現代碼不必要難以閱讀,因爲一)風格並不一致和b)不使用括號和無處不在的新線。 – Jon

+0

@Jon, 謝謝。我增加了另一種方法,你會說這個更好嗎? – user2422960

+0

我認爲這比較好,但是我個人會在條件之外移動「如果一切正常」部分。用if/else檢查故障條件,然後單獨檢查if(!dfd.isRejected()),然後將代碼移到那裏。對我來說,這是更好的邏輯分離。另外,這個問題可能應該轉移到Code Review。 – Jon

回答

0
  1. 可以使用switch語句更清潔的代碼。
  2. 「迴歸」將迫使從函數退出而不執行的代碼的其餘部分
+0

返回還會阻止我的函數返回我的承諾 – user2422960

+0

@ user2422960:顯然,您將返回所有*返回值中的承諾。但是你甚至不需要這麼做,因爲'if' /'else if'將總是隻評估一個分支體。 – Jon

+0

如果你需要總是返回dfd.promise,你可以簡單地做這樣的事情: if(!credentials)dfd.reject('No user credentials given'); return dfd.promise; – mpalma