Я использую услугу "Угловой HTTP" и перехватываю ответ от сервера, чтобы поймать любые ошибки сервера и сделать некоторые вещи с ними (протоколирование и т.д.), Прежде чем отказаться от обещания.
В стороне, я иногда получаю такие вещи, как ошибки проверки в теле ответа, хотя код состояния - 200. Я знаю, что это не идеальный, но, пожалуйста, не зацикливайтесь на этом, поскольку это не причина моей проблемы. Я думал, что упомянул об этом, хотя он объясняет, почему я перехватываю ответ и responseError
$httpProvider.interceptors.push(function($log, $rootScope, $q) {
return {
response: function(response) {
if (response.data && response.data.success === false) {
doSomeStuff(response);
return $q.reject(response);
}
else{
return response;
}
},
responseError: function(rejection) {
doSomeStuff(rejection);
$q.reject(rejection);
}
};
});
Тогда типичный HTTP-вызов в моем приложении может выглядеть так.
$http.post('https://domain.com/api/whatever', data).then(function (response) {
console.log("Don't do this when an error is returned")
});
К сожалению, console.log всегда работает, даже если есть ошибка HTTP, или статус 200 со встроенными ошибками.
Я уверен, что я просто не понимаю, как работает $ http/$ q, и кто-то сможет меня расставить прямо.
$q.reject(rejection);
возвращает новое отклоненное обещание, оно не влияет на состояние существующих обещаний. Фактически, все, что responseError
делает здесь, это улавливает отказ и вместо этого возвращает undefined
ответ.
Должен быть
responseError: function(rejection) {
doSomeStuff(rejection);
return $q.reject(rejection);
}