簡體   English   中英

如何使用Angular的$ q promises檢索HTTP狀態代碼?

[英]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) {});

但是,如果我使用此代碼塊,則statusheadersconfig都是未定義的。 我的問題是如何保留此語法,但仍檢索錯誤代碼?

作為補充參考,后端是一個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方法外,還具有successerror方法。 有關更多信息,請訪問Angular docs中的$ http

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM