在我的应用程序中,我使用拦截器来捕获所有http响应错误,例如:
var response = function(response) {
if(response.config.url.indexOf('?page=') > -1) {
skipException = true;
}
return response;
}
var responseError = function(rejection) {
if (rejection.status === 401 || rejection.status === 403) {
/**/
}
else if (rejection.status >= 500 || rejection.status === 0) {
/**/
}
else if (rejection.status === 404 && !skipException) {
/**/
}
else if (rejection.status === 404 && skipException) {
/**/
}
else{
/**/
}
return $q.reject(rejection);
};
当我转到我的控制器时(当我的getArticles
方法返回一些数据时,而不是404 - 当文章数组为空时)一切正常:404 skipException == true
被捕获。
但是当我的文章数组为空时,服务器返回404,当我进入该控制器时,我无法获得response.config.url
- 没有响应,但为什么?我认为拦截器会捕获所有响应。
$timeout(function() {
$scope.getArticles();
}, 100);
和$scope.getArticles
有这样的代码:
getDataService.getArticles($scope.pageNum).then(function(response) {
/**/
});
服务:
var getEventsByScrollService = function(num) {
var deferred = $q.defer();
$http.get(***, {
})
.success(function(response) {
deferred.resolve(response);
}).error(function(err, status) {
if (status === 404){
deferred.resolve([]);
}
else{
deferred.reject(err);
}
});
return deferred.promise;
};
如何根据网址有条件地捕获404?因为:
if(response.config.url.indexOf('?page=') > -1) {
并不总是有效。
答案 0 :(得分:3)
为了更加可维护和扩展到任何$ http服务调用,可以这样做:
// Service call
$http.get({url:'/?page=', ignoreErrors: true})
// Interceptor
if(rejection.status === 404 && !rejection.config.ignoreErrors) {
}
答案 1 :(得分:2)
你可以查看Restangular,可能对你有用。它内置了很好的拦截器方法。它是否真的对你有好处取决于你是否使用RESTful API。 https://github.com/mgonto/restangular
答案 2 :(得分:1)
在"响应"你应该检查响应网址,而不是response.config.url .. 像这样的东西:
var response = function(response) {
if(response.url.indexOf('?page=') > -1) {
skipException = true;
}
return response;
}
在响应级别,您没有config
答案 3 :(得分:1)
...这样 我这样做了:
if(rejection.config.url.indexOf('?page=') > -1) {
skipException = true;
}
答案 4 :(得分:-1)
200到299之间的响应状态代码被视为成功 status并将导致调用成功回调。
由于服务器返回404,因此调用responseError
函数。不幸的是,config参数不可用,因此您无法根据请求网址执行任何条件逻辑。