角旋转器|跳过$ http.post错误处理

时间:2014-09-08 13:08:04

标签: javascript ajax angularjs

我正在使用angular-spinner拦截来自我的应用程序的所有http请求并显示加载微调器。

相关代码: -

//spinner configuration START
        myApp.factory('spinnerInterceptor', ['usSpinnerService', function(usSpinnerService) {
            return  {
                     request: function(config) {
                         usSpinnerService.spin('spinner-1');
                         return config;
                     },
                     response:function(config){
                         usSpinnerService.stop('spinner-1');
                         return config;
                     },
                     responseError:function(config){
                         usSpinnerService.stop('spinner-1');
                         return config;
                     }
            };
        }]);

        myApp.config(['$httpProvider', function($httpProvider) {
            $httpProvider.interceptors.push('spinnerInterceptor');
        }]);
        //spinner configuration END

除了启动/停止微调器之外,我只是返回配置对象。

问题: -

我的一个POST RESTful端点,返回404状态并显示错误消息,$ http块的仍然成功处理程序被执行?为什么呢?

$http({
                    method : 'POST',
                    url : url,
                    params :paramsJson,
                    data : _data
                }).success(function(data,status) {
                    // THIS GET EXECUTED AFTER SPINNER INTERCEPTOR  WITH STATUS 404 !!!!
                }).error(function(data,status) {
                    // THIS BLOCK I EXPECT TO RUN IN CASE OF 404 or any non 2XX response
                });

在$ http的成功/错误处理程序之前,spinnerInterceptor会被执行,这是在某处播放返回的promise的错误处理。

在没有微调器拦截器的情况下运行我的代码时,一切都按预期工作。

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

这里的问题是“responseError”拦截器。您需要拒绝此块中的请求。你的拦截器已经处理了其他错误,所以你在这里返回的将是成功阻止。

更正的拦截器代码是:

  responseError:function(config){//here we get response rename it
             usSpinnerService.stop('spinner-1');
             return $q.reject(config);
         }

您可以参考Error Handling in angular了解更多信息。

答案 1 :(得分:0)

我必须开发一个"自动"微调器最近在一个项目中。我使用$ q promises来表示拦截器方法的成功/错误,它运行良好。我的代码是:

(function(){     '使用严格的';

function httpBusyInterceptor($q) {


    function _responseError (response) {                      
        //Hide spinner code
        return $q.reject(response);
    }

    function _response (response) {                    
        //Hide spinner code
        return response || $q.when(response);
    }

    function _request (config) {                       
        //Show spinner code
        return config || $q.when(config);
    }

   return {
        request: _request,
        response: _response,
        responseError: _responseError
    };
}
httpBusyInterceptor.$inject = ['$q'];

angular.module('common.ui').factory('httpBusyInterceptor', httpBusyInterceptor);

})();