【发布时间】:2015-05-15 16:03:20
【问题描述】:
在我的应用程序中,我使用拦截器来捕获所有 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) {
并不总是有效。
【问题讨论】:
-
通过 URL 检查逻辑听起来是错误的。似乎您应该为不同的拦截器行为提供不同的服务和/或服务方法,服务方法应该调用不同的拦截器,这些拦截器调用不同的错误解析器。其中一个错误解决程序应处理 404,另一个应忽略 404。服务方法应该决定这一点。将逻辑与 URL 的耦合听起来像是违反 SoC。
-
能否分享完整的错误响应代码
-
@DaveAlperovich 你能提供我用不同拦截器的例子吗?
-
为什么文章数组为空时服务器会返回 404?那不是以空数组作为返回的响应 200 吗?
-
@Claies 后端的开发方式很奇怪...
标签: javascript html angularjs