如何使用Angular检索HTTP状态代码;s$q承诺

How can I retrieve HTTP status codes using Angular's $q promises?

本文关键字:承诺 代码 状态 何使用 Angular 检索 HTTP      更新时间:2023-09-26

我的代码中有一个$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();等返回错误。

试试这样的东西:

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已经返回了一个promise,为什么不使用它呢?

function myFunction() {
  return $http.post(url);
}
// ...
myFunction().success(function(data, status, headers, config) {
  // ...
});
... or ...
myFunction().then(...);

$http返回的promise除了具有其他promise方法之外,还具有方法successerror。阅读更多关于$http的Angular文档。