我只是使用Angular的$ http模块测试超时功能,但是它一直作为响应返回undefined
如果像这样进行设置就没问题,但是如果我使用.error(function)
而不是.then(function)
,那么$http
调用会尝试从中抓取数据字段时出错未定义的对象
var timeout = $q.defer();
var config = {
url: 'http://192.168.1.65:3000',
timeout: timeout.promise,
method: 'POST'
};
$http(config).then(function(res) {
// This is always undefined when timeout occurs
console.log(res);
});
$timeout(function() {
console.log('resolving the promise to abort the http call. This works fine');
timeout.resolve();
}, 1000);
任何想法我做错了什么?
答案 0 :(得分:3)
当$http
超时时,它会返回您可以使用.catch
处理的拒绝承诺:
$http(config)
.then(function(response){
})
.catch(function(error){
// will fire when timed out
})
偏离主题:使用$timeout
生成的承诺实际上更简单,而不需要$q.defer
:
var timeout = $timeout(angular.noop, 1000);
$http.get(url, {timeout: timeout})
.then(...)
.catch(...)
修改强>
如果存在拦截器,则超时将导致responseError
,并且如果已定义,则该拦截器实际上“处理”该错误,因此它不再成为被拒绝的承诺,并且结果将路由到{{ 1}} - 如果您没有从.then
函数返回任何内容,则传递给responseError
处理程序的数据为.then
。如果你想保留拒绝,你可以这样做:
undefined