Отклонить "ответ" в "responseError"
Иногда API, который я использую, возвращает 200 ok
, хотя произошла ошибка. Объект ответа JSON будет выглядеть примерно так:
{
error: true
}
Я построил перехватчик $http response
, который просто проверяет эту ошибку и отклоняет ее. Я хочу, чтобы он прыгнул в мою функцию responseError
:
$httpProvider.interceptors.push(function($q) {
return {
response: function (response) {
if (response.data.error) {
// There has been an error, reject this response
return $q.reject(response);
}
return response;
},
responseError: function(rejection) {
// Display an error message to the user
...
return $q.reject(rejection);
}
}
});
Проблема в том, что даже после отклонения ответа моя функция responseError
не вызывается. Он вызывается при ошибках 500
и т.д., Поэтому я знаю, что он работает. Я ожидаю, что отказ будет делать то же самое.
Из docs:
responseError: interceptor gets called when a previous interceptor threw an error or resolved with a rejection.
Любые идеи о том, что не хватает?
Ответы
Ответ 1
Похоже, это невозможно сделать. Чтобы сократить дублирующийся код, просто объявите функцию обработки ошибок отдельно и повторно используйте ее в функциях ответа и ответаError.
$httpProvider.interceptors.push(function($q) {
var handleError = function (rejection) { ... }
return {
response: function (response) {
if (response.data.error) {
return handleError(response);
}
return response;
},
responseError: handleError
}
});
Ответ 2
Чтобы добавить к этому ответу: отклонение обещания в ответном перехватчике делает что-то.
Хотя можно было бы ожидать, что он вызовет responseError с первого взгляда, это не будет иметь большого смысла: запрос выполняется с помощью succes.
Но отклонение его в ответном перехватчике заставит вызывающего лица обещать пойти на обработку ошибок.
Поэтому, делая это
$http.get('some_url')
.then(succes)
.catch(err)
Отклонение обещания вызовет функцию catch. Таким образом, у вас нет правильной общей обработки ошибок, но ваше обещание отклонено, и это полезно: -)
Ответ 3
Если вы хотите передать HTTP-ответ обработчику responseError, вы можете сделать это следующим образом:
$httpProvider.interceptors.push(function($q) {
var self = {
response: function (response) {
if (response.data.error) {
return self.responseError(response);
}
return response;
},
responseError: function(response) {
// ... do things with the response
}
}
return self;
});