【问题标题】:How to deal with "Random HTTP GET" error如何处理“随机 HTTP GET”错误
【发布时间】:2014-04-08 06:38:53
【问题描述】:

我需要一一发送多个获取请求(必需)。当计数为 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。问题仍然存在。]

请建议我如何知道问题所在。那只有我能想到解决办法了。

谢谢!!

【问题讨论】:

  • 可能你的服务器不允许6个并发连接到同一个客户端...
  • 如果是这样的话……绝对不会允许的。问题是:它有时有效,有时需要 1 个请求。失败,有时 3 次失败...
  • 修复服务器。听起来好像坏了。
  • 服务器的问题?我不这么认为。有什么线索?

标签: javascript angularjs http get http-get


【解决方案1】:

这是一个可以包装 HTTP 调用的函数。它将重复调用直到它通过。谨防!如果 HTTP 调用在 100% 的情况下失败(例如,格式错误的 URL),则函数不会停止(在测试中,函数被调用 >70,000 次。显然,promise 没有递归限制)。对于这种情况,我包含了一个有限版本的函数,该函数会在 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 注入你的控制器/服务/等。

【讨论】:

  • 答案似乎不错。我尝试过这样的事情。在 HTTP 获取错误时,我迭代了“n”号请求。次。如果我能找到发生此问题的原因而不是找到解决方案,我会很高兴。你能帮我找到那个吗。
  • 你运行服务器吗?我同意 Adam Batkin 的观点,这听起来像是服务器问题,因为您可以重复请求并且它可以工作。
  • 是的!我正在运行服务器。好吧,它说:500(内部服务器错误)所以亚当的观点可能是触动了神经。但是我怎么知道坏了。细节:这是一个处理简单脚手架的 Rails 服务器。
猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 2021-10-05
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
相关资源
最近更新 更多