Angular $ http超时返回undefined

时间:2015-05-21 20:16:25

标签: angularjs

我只是使用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);

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:3)

$http超时时,它会返回您可以使用.catch处理的拒绝承诺:

$http(config)
  .then(function(response){
  })
  .catch(function(error){
     // will fire when timed out
  })

Demo

偏离主题:使用$timeout生成的承诺实际上更简单,而不需要$q.defer

var timeout = $timeout(angular.noop, 1000);
$http.get(url, {timeout: timeout})
     .then(...)
     .catch(...)

修改

如果存在拦截器,则超时将导致responseError,并且如果已定义,则该拦截器实际上“处理”该错误,因此它不再成为被拒绝的承诺,并且结果将路由到{{ 1}} - 如果您没有从.then函数返回任何内容,则传递给responseError处理程序的数据为.then。如果你想保留拒绝,你可以这样做:

undefined