AngularJS中的HTTPInterceptor

时间:2014-10-21 03:14:22

标签: angularjs

我们有API在响应XML中返回错误,而不是拒绝它们并发送错误响应。 所以我有以下代码来处理它们,

                $http({
                    url: apiURL,
                    method: "POST",
                    data: req,
                    headers: oHeaders,
                    dataType: "xml",
                })
                .success(function(data,status) {
                    console.log('success!!!!!');
                    deff.resolve(data);
                })
                .error(function(data,status) {
                    console.log('This is what I want to see!!!!!');
                    deff.reject(data);
                });


myApp.factory('customHttpInterceptor', ['$q', function ($q) {
    return function (promise) {
        return promise.then(function (response) {
            var parsed;
            if (response.config.dataType == 'xml'){
                parsed = $.xml2json(response.data);
                if (parsed) {
                    angular.forEach(parsed, function(v, k) {
                        if (k == 'status') { 
                            if (v.APIErrors) {
                                return $q.reject(response);
                            }     
                        }                          
                    });                     
                }
                console.log(parsed);
            }   
            return response;
        }, function (errResponse) {
            // do something on error
            console.log('Error section in interceptor');
            return $q.reject(errResponse);
        });
    };
}]);    

我期望得到的是,当拦截器中发现错误时,它将拒绝承诺,控件将进入$ http的错误部分并记录"这就是我想要的见!!!!!"信息。但相反是显示"成功!!!!!"信息。

这是它的工作方式还是我做错了什么?

的Ish

1 个答案:

答案 0 :(得分:1)

我看到一些看似错误的事情:

forEach

中返回结果
angular.forEach(parsed, function(v, k) {
  if (k == 'status') {
    if (v.APIErrors) {
      return $q.reject(response);
    }
  }
});

你可能写过这个,因为你习惯将return语句放在for循环中。这在这里不起作用,因为你从函数体内部返回。 从不 有任何理由在forEach正文函数中返回内容:此值不会被任何内容使用。

Angular Interceptor API

也许你只是没有在你的代码中显示它,但你必须注册你的拦截器。

$httpProvider.interceptors.push('customHttpInterceptor');

更重要的是,你的拦截器没有正确的形式:在你的情况下,它应该是一个带有response方法的对象,它返回响应响应的承诺。