[英]How can I retrieve HTTP status codes using Angular's $q promises?
我的代碼中有一個將$http.post
到后端的代碼,當然可能會出錯。 如果我在angular中使用以下語法:
$http.post(url).success(function(data, status, headers, config))
.error(function(data, status, headers, config));
如果有錯誤,我可以使用status
檢索錯誤代碼,並在error()
定義的函數中處理它。 但是,如果我改為采用這種方法(實際上是我正在使用的方法):
var deferred = $q.defer();
$http.post(url).success(deferred.resolve).error(deferred.reject);
return deferred.promise;
使用第二種語法,我所有的ajax調用都放在一個單獨的ServiceJS
目錄中,並且可以根據情況處理成功或錯誤。 例如,如果第二個片段是Service.MyFunction()
那么在我需要的代碼中,我將:
Service.MyFunction().then(function() {},
function(data, status, headers, config) {});
但是,如果我使用此代碼塊,則status
, headers
, config
都是未定義的。 我的問題是如何保留此語法,但仍檢索錯誤代碼?
作為補充參考,后端是一個C#Web API項目,該項目將使用return BadRequest();
返回錯誤return BadRequest();
或類似的東西。
嘗試這樣的事情:
myFunction(){
var deferred = $q.defer();
// you can use .then() instead of .success or .error
$http.post(url).then(function(successResponse){
var data = successResponse.data;
var status = successResponse.status;
...
deferred.resolve(successResponse);
}, function(failureResponse){
var status = failureResponse.status;
var config = failureResponse.config;
...
deferred.reject(failureResponse);
});
return deferred.promise;
}
好吧,我想說這是一個很好的實踐,是實現http攔截器並從那里處理HTTP錯誤的一種更好的標准,它涉及在每個http或資源對象上一一處理錯誤,並且您的代碼將位於一個位置。
基本上,您可以根據所得到的錯誤狀態來細分要采取的措施,例如:
angular.module('app').factory('myInterceptor', ['$q',
function($q){
return {
'responseError': function(rejection){
switch(rejection.status){
case 0:
//'No connection, is the internet down?'
break;
case 422:
// error
break;
case 484:
// error
break;
default:
// message rejection.status, rejection.statusText
break;
}
return $q.reject(rejection);
}
};
}
]);
$http
已經返回了一個承諾,那么為什么不使用那個承諾呢?
function myFunction() {
return $http.post(url);
}
// ...
myFunction().success(function(data, status, headers, config) {
// ...
});
... or ...
myFunction().then(...);
從$http
返回的promise除了其他promise方法外,還具有success
和error
方法。 有關更多信息,請訪問Angular docs中的$ http 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.