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

时间:2014-11-12 19:16:40

标签: javascript c# angularjs

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

3 个答案:

答案 0 :(得分:3)

尝试这样的事情:

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;
}

答案 1 :(得分:1)

好吧,我说这是一个很好的做法,更实际的是实现一个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);
            }
        };
    }
    ]); 

答案 2 :(得分:0)

$http已经回复了一个承诺,为什么不使用那个呢?

function myFunction() {
  return $http.post(url);
}

// ...

myFunction().success(function(data, status, headers, config) {
  // ...
});

... or ...

myFunction().then(...);

$http返回的承诺除了其他承诺方法外,还有方法successerror。阅读更多Angular docs for $http