Nein, dies ist kein beabsichtigtes Verhalten.Normalerweise sollte es .then()
aufanrufenund .catch()
auf HTTP 4xx
und HTTP 5xx
(nicht sicher über die anderen).
Das beschriebene Verhalten wird wahrscheinlich durch ein weiteres .catch()
verursacht, das eine aufgelöste Zusage zurückgibt.
In einem etwas geändert Beispiel:
//In some Service:
function getResources()
{
$http.get('/some/resource')
// /some/resource --> HTTP 400
.then(function(response)
{
console.log('service success');
return response;
})
.catch(function(reason)
{
console.log('service error');
// IMPORTANT: although this is returned
// in a .catch() it returns a resolved promise
return reason;
});
}
//In some Controller:
someService.getResources()
.then(function(response)
{
console.log('controller success');
})
.catch(function(reason)
{
console.log('controller error');
});
// Console:
// - service error
// - controller success
Beachten Sie, dass dies auch von einer registrierten http interceptor
verursacht werden:
$httpProvider.interceptors.push(function($q)
{
return {
'response': function(response)
{
// do something
return response;
},
'responseError': function(rejection)
{
// do something
return rejection; // <-- this causes the problem
// instead do
return $q.reject(rejection);
}
}
}
Dies ist nicht das Standardverhalten, sondern möglicherweise auf einen Antwort-Interceptor zurückzuführen, den Sie in Ihrer Anwendung verwendet haben. In der Regel sind die Antwort-Interzeptoren global und Sie wissen vielleicht nicht, dass sie vorhanden sind, wenn es sich um eine große Anwendung handelt. Können Sie diesen Code in einer Geige isolieren, um das gleiche Problem zu reproduzieren? – arunkjn
Ich habe dies als selbst beantwortete Q & A Frage erstellt, um es für andere Leute zu halten, da es keine ähnliche Frage hier auf SO gab. Sie beschreiben genau das Problem, auf das ich mit diesem Beitrag hinweisen wollte (siehe auch meine ausführliche Antwort). Immer noch danke für die Antwort :) – Aides