在与.then(successFunc)
和.catch(errFunc)
的每次$ http通话中(或then(successFunc, errFunc)
,始终会调用then
/ success
(承诺已成功解决)。
实施例
$http.get('/some/resource')
// /some/resource --> HTTP 400
.then(function(response)
{
console.log('success');
})
.catch(function(reason)
{
console.log('error');
})
// Console:
// - success
这是预期的行为还是导致这种行为的原因?
答案 0 :(得分:1)
不,这不是预期的行为。通常情况下,它应该.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);
}
}
}
答案 1 :(得分:1)
您的示例将拒绝转换为已解决的承诺。
$http.get('/some/resource')
// /some/resource --> HTTP 400
.then(function(response)
{
console.log('success');
//IMPORTANT -- return to chain data
return response;
})
.catch(function(reason)
{
console.log('error');
//IMPORTANT -- throw to chain rejections
throw reason;
})
当catch处理程序省略throw
语句时,该函数返回undefined
将拒绝转换为解析undefined
的承诺。
在代码中查找遵循相同错误模式的http interceptor。
函数式编程中的规则总是return
(或throw
)。