Отклонить из "ответа" в "responseError"
иногда API, который я использую, возвращает там была ошибка. Объект ответа 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.
любые идеи о том, чего не хватает?
3 ответов
похоже, это невозможно сделать. Чтобы сократить дубликат кода, просто объявите функцию обработки ошибок отдельно и повторно используйте ее внутри функций response и responseError.
$httpProvider.interceptors.push(function($q) {
var handleError = function (rejection) { ... }
return {
response: function (response) {
if (response.data.error) {
return handleError(response);
}
return response;
},
responseError: handleError
}
});
чтобы добавить к этому ответу: отклонение обещания в перехватчике ответов что-то делает.
хотя можно было бы ожидать, что он вызовет responseError на первый взгляд, это не имеет большого смысла: запрос выполняется с успехом. Но отклонение его в перехватчике ответа заставит вызывающего обещание перейти к обработке ошибок. Так что при этом
$http.get('some_url')
.then(succes)
.catch(err)
отклонение обещания вызовет функцию catch. Так что у тебя нет настоящего себя. общая обработка ошибок, но ваше обещание отклоняется, и это полезно: -)
Если вы хотите передать 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;
});