javascript - 如何处理 "Random HTTP GET"错误

标签 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 库。 [内部使用http get。问题仍然存在。]

请建议我怎么知道问题出在哪里。那只有我能想出办法了。

谢谢!!

最佳答案

这是一个函数,您可以在其中包装 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 注入(inject)你的 Controller /服务/等等。

关于javascript - 如何处理 "Random HTTP GET"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22929414/

相关文章:

angularjs - 无法更改附加到 Angular js范围的变量值?

java - 非 servlet Java HTTP 服务器

javascript - 无法读取未定义的属性 "rid"

javascript - 从文本字段动态收集文本

javascript - node.js 本地模块 : module not found error in subfolder

javascript - 尝试理解 Javascript 闭包 + 内存泄漏

javascript - Spring Boot WRo4j 需要重新启动应用程序才能看到 javascript 更改

javascript - 防止 ng-select 在焦点丢失时触发

javascript - 获取javascript中任何给定单词/句子的google结果数量

http - openssl s_client 通过代理与 clientAuth 建立 TLS 连接