在我的应用程序中,我使用拦截器来捕获所有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时-当文章数组为空时),一切都是正常的:带有skipException == true
的404被捕获。
但是当我的文章数组为空时,服务器返回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;
};
如何根据URL有条件地捕获404?因为这是:
if(response.config.url.indexOf('?page=') > -1) {
并不总是有效的。
发布于 2015-04-29 16:14:49
所以..。我已经这样做了:
if(rejection.config.url.indexOf('?page=') > -1) {
skipException = true;
}
发布于 2015-04-30 01:11:34
为了提高任何$http服务调用的可维护性和可扩展性,可以这样做:
// Service call
$http.get({url:'/?page=', ignoreErrors: true})
// Interceptor
if(rejection.status === 404 && !rejection.config.ignoreErrors) {
}
发布于 2015-04-29 15:26:34
你可以去查一下Restangular,这可能对你的目的有用。它内置了很好的拦截器方法。它是否真的对您有好处将取决于您是否使用了RESTful应用程序接口。https://github.com/mgonto/restangular
https://stackoverflow.com/questions/29027724
复制相似问题