我正在使用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的错误处理。
在没有微调器拦截器的情况下运行我的代码时,一切都按预期工作。
请帮我解决这个问题。
答案 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);
})();