1

我目前正在AngularJS 1.3中構建一個登錄流。我的問題是,從$ http調用返回的promise並不能解決其'.then'中的代碼。

我正在處理從服務器返回的錯誤消息,特別是處理在用戶輸入錯誤的用戶名或密碼時返回的任何401錯誤。但是,當返回401時,.then永遠不會自行解析,而且它們內部的代碼永遠不會運行。

相關的代碼如下:

登錄表單作爲其範圍的登錄功能的控制器,如下所示:

$scope.login = function() { 
    $scope.authError = null; 

    // Try to login 
    var promise = session.login($scope.user); 

    promise.then(function(loggedIn) { 

     // THIS CODE NEVER RUNS 

     if (!loggedIn) { 
      $scope.authError = localizedMessages.get('login.error.invalidCredentials'); 
     } 

    }, function(x) { 
     $scope.authError = localizedMessages.get('login.error.serverError', { exception: x }); 
    }); 
}; 

我有一個會話工廠,需要登錄的護理和其他基於會話的需求。登錄碼是:

login: function(credentials) { 
    var $http = $injector.get('$http'); 
    var url = ENV.apiEndpoint + "/sessions"; 

    var newSession = $http.post(url, credentials); 

    return newSession.then(function(data) { 
     session.set(data.token); 

     //THIS CODE ONLY RUNS ON A SUCCESS RESPONSE 

     if(session.isAuthenticated()) { 
      closeLoginModal(true); 
     } 

     return session.isAuthenticated(); 
    }); 
} 

我已經在代碼中發現了問題所在的註釋。我對這個代碼不工作的原因感到茫然。根據我對承諾的理解,無論答案是什麼,錯誤就成功了,那麼'那麼'就應該解決。

我有一個攔截器正在運行,但我試過禁用它沒有運氣到最終的結果。

我錯過了什麼嗎?

+0

401不會解析爲「錯誤」(或其它在Angular中調用的)嗎?錯誤函數是否運行? – 2014-12-05 16:21:14

+0

它確實解決了一個錯誤,但如果我是正確的,那麼無論該承諾是成功還是錯誤,都應該解決。如果出現錯誤,應該調用控制器中.then的第二個函數。我錯了嗎? – Octothorpe 2014-12-05 16:23:13

+0

...所以這是解決,並運行錯誤功能。這似乎是正確的,因爲HTTP調用會導致HTTP錯誤代碼。也許你正在描述錯誤發生的情況:錯誤函數被調用了嗎? – 2014-12-05 16:24:38

回答

1

如果您的登錄名(服務器端)返回HTTP錯誤代碼,如401,則應解析爲錯誤,例如,第二個函數傳遞給then。如果你不通過,它應該被炸掉;這就是爲什麼你的高級錯誤函數被調用的原因。

+0

謝謝戴夫。這絕對是一個很大的幫助。我沒有調試攔截器,但我收到了我需要的消息。 – Octothorpe 2014-12-05 19:37:50