Нет, это не намеренное поведение. Обычно оно должно звонить .then()
на HTTP 2xx
и .catch()
по телефону HTTP 4xx
и HTTP 5xx
(не уверены в других).
Описанное поведение, вероятно, вызвано еще одним .catch()
, возвращением разрешенного обещания.
В слегка измененном примере:
//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
Обратите внимание, что это также может быть вызвано зарегистрированной http interceptor
:
$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);
}
}
}
Это не поведение по умолчанию, но может быть связано с ответом-перехватчиком, который вы использовали в своем приложении. Обычно ответные перехватчики являются глобальными, и вы можете не знать о его присутствии, если это большое приложение. Не могли бы вы изолировать этот код в скрипте, чтобы воспроизвести ту же проблему? – arunkjn
Я создал это как ответ на вопрос Q & A, чтобы сохранить его для других людей, поскольку здесь не было похожего вопроса о SO. Вы точно описываете вопрос, который я хотел бы указать на этот пост (также см. Мой подробный ответ). Еще спасибо за ответ :) – Aides