Ответ 1
так... я сделал это так:
if(rejection.config.url.indexOf('?page=') > -1) {
skipException = true;
}
В моем приложении я использую перехватчик, чтобы поймать все ошибки 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 в зависимости от URL? Потому что это:
if(response.config.url.indexOf('?page=') > -1) {
Не всегда работает.
так... я сделал это так:
if(rejection.config.url.indexOf('?page=') > -1) {
skipException = true;
}
вы можете проверить Restangular, может быть полезно для ваших целей. У этого есть хорошие методы перехватчика, встроенные. Будет ли это действительно хорошо для Вас, будет зависеть от того, используете ли вы RESTful API или нет. https://github.com/mgonto/restangular
В целях обеспечения большей поддержки и расширения для любого вызова службы $http это можно сделать:
// Service call
$http.get({url:'/?page=', ignoreErrors: true})
// Interceptor
if(rejection.status === 404 && !rejection.config.ignoreErrors) {
}
В "ответе" вы проверяете ответный url, а не response.config.url.. что-то вроде этого:
var response = function(response) {
if(response.url.indexOf('?page=') > -1) {
skipException = true;
}
return response;
}
на уровне ответа у вас нет config
Из документации:
Код состояния ответа от 200 до 299 считается успешным статус и вызовет вызов обратного вызова успеха.
Так как сервер возвращает 404, функция responseError
вызывается. К сожалению, параметр конфигурации недоступен, поэтому вы не можете выполнять условную логику на основе URL-адреса запроса.