繁体   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