如何处理“随机HTTP GET”错误

时间:2014-04-08 06:38:53

标签: javascript angularjs http get http-get

我需要逐个发送多个get请求(必需)。当计数为2-3时,它工作正常,但是有近6个HTTP Get请求,有时其中一些失败并给出Internal Sever Error(500)。在新选项卡中打开错误链接可提供所需的结果。

所以服务器端没有任何问题。

我在localhostproduction都遇到了这个问题。 如何从客户端处理这种情况?

我试过了:

  1. NodeJS + SocketIO无需询问即可从服务器发送数据。 [如果套接字一直写到60秒,那么有太多的数据。套接字重新注册&从头开始重启。]
  2. Angular + NGResource。 [内部使用http get。问题仍然存在。]
  3. Angular + Restangular Lib。 [内部使用http get。问题仍然存在。]
  4. 请建议我如何知道问题所在。然后我才能想到解决方案。

    日Thnx !!

1 个答案:

答案 0 :(得分:1)

这是一个可以包装HTTP调用的函数。它会重复通话直到通过。谨防!如果HTTP调用在100%的时间内失败(例如,格式错误的URL),那么该函数将不会停止(在测试中,该函数被称为> 70,000次。显然,promises没有递归限制)。对于这种情况,我已经包含了在n次尝试后停止的函数的限制版本。

var persistentRequest = function(requestFn) {
  var deferred = $q.defer();
  requestFn().then(function() {
    deferred.resolve();
  }, function() {
    persistentRequest(requestFn).then(
      function() {
        deferred.resolve();
      }
    );
  });

  return deferred.promise;
}

var persistentRequestLimited = function(requestFn, n) {
  var deferred = $q.defer();
  if (n <= 0) {
    deferred.reject('Did not complete in given number of tries');
  } else {
    requestFn().then(function(data) {
      deferred.resolve(data);
    }, function() {
      persistentRequestLimited(requestFn, n-1).then(
        function(data) {
          deferred.resolve(data);
        },
        function(rejection) {
          deferred.reject(rejection);
        }
      );
    });
  }

  return deferred.promise;
}

例如,使用它:

persistentRequest(function() {
  return $http.get('/myurl');
});

persistentRequestLimited(function() {
  return $http.get('/myurl');
}, 10);

不要忘记将$ q注入您的控制器/服务/等。