【问题标题】:Prevent AngularJS $http return on timeout防止 AngularJS $http 超时返回
【发布时间】:2015-11-05 10:01:40
【问题描述】:

我正在做自定义的$http 服务,看起来像这样:

angular.factory('myHttp', function($http){
    var obj = {};

    obj.get = function(path) {
        return $http.get(path,{timeout: 5000}).error(function (result) {
                console.log("retrying");
                return obj.get(path);
        });
    }
});

系统运行良好。它确实在成功时返回数据,并在连接失败时重试。但是,我面临的问题是连接超时时它将返回控制器。如何防止它返回并继续重试?

【问题讨论】:

  • 在您的代码中查找 retry 逻辑并在那里修复它。抱歉,如果没有看到您的代码,无法给您任何其他建议。重试不是$http 功能。
  • @Michael 这是我上面的代码......要使用它,可以通过myHttp.get($scope.url).success(function(response) {}); 使用它有什么建议可以让它工作吗?
  • @Michael 就在那里.....return obj.get(path); 逻辑有效,即使超时也会重试。问题是当它超时时,它不会等待重试并返回......
  • 好吧.. 是的,我正在寻找其他地方。您应该使用.then(null, errorCallback) 而不是error。使用then 你可以返回一个promise,但不能使用errorerror 无论如何都已弃用,不应再使用。
  • @Michael 非常感谢您的帮助。使用您的建议方法,我可以重试。然而,另一个问题出现了。也就是在使用myHttp.get('url').then(successCallback, errorCallback)时,即使服务返回失败连接,也会返回successCallback而不是errorCallback。我怎样才能到达errorCallback

标签: javascript angularjs


【解决方案1】:

您需要使用$q.reject。这将表明错误处理程序再次失败,结果应填充到父错误处理程序 - 而不是成功处理程序。

  obj.get = function(path) {
    return $http.get(path, {
      timeout: 5000
    }).then(null, function(result) {
      console.log("retrying");
      if (i < retry) {
        i += 1;
        return obj.get(path);
      } else {
        return $q.reject(result); // <-- use $q.reject
      }
    });
  }

plunker

【讨论】:

  • 非常感谢您的大力帮助。
  • 我面临一个问题。连接成功后如何重置计数器i
  • 将计数器 i 放入 get 函数并包装 $http 请求,这样您就可以在不重置计数器的情况下进行重试。通过此设置,计数器i 始终从 0 开始。无论之前的请求是否成功。查看更新的 plunker
  • 非常感谢您的回复。但是如何访问更新的 plunker?
  • 在这个答案中有 plunker 链接
【解决方案2】:

查看reject.status 来确定超时

  $http.get('/path', { timeout: 5000 })
    .then(function(){

      // Your request served

    },function(reject){


      if(reject.status === 0) {

         // $http timeout

      } else {

         // response error 

      }
    });

请参阅以下问题以获得有关处理超时错误的良好概述:

Angular $http : setting a promise on the 'timeout' config

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-12
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-10-21
    • 2017-05-16
    • 2023-04-02
    相关资源
    最近更新 更多