【问题标题】:jQuery ajax call never finishes (success and error callbacks are not fired)jQuery ajax 调用永远不会完成(不会触发成功和错误回调)
【发布时间】:2013-01-25 19:34:55
【问题描述】:

我有一个对服务器的 ajax 请求,我只需要知道它何时完成将用户重定向到第二个页面。 它大部分时间都在工作,但如果服务器响应时间过长(例如 10 分钟),则可能会发生没有调用回调函数并且请求一直等待的情况。

我的代码如下:

$.ajax({
      type: 'post',
      url: 'request.php',
      success: function(data) {
            alert("Success: "+data);
            window.location.replace("success.php");
      },
      error: function (xhr, ajaxOptions, thrownError) {
            alert("Ajax error: "+xhr.status+" - "+thrownError);
            window.location.replace("error.php");
      }
});

如您所见,我已尝试检查是否有任何错误,但就我到达时而言,ajax 请求的行为就好像它尚未完成(没有触发警报或重定向)。但是,服务器中的 PHP 代码运行到最后都没有错误。

我不知道在哪里搜索错误,因为我在考虑浏览器或服务器中的超时问题,但这似乎不是原因。由于相同的代码在很短的等待时间内运行,我无法想象其他可能的原因。

谢谢!

【问题讨论】:

  • 网络控制台显示什么有趣的东西吗?浏览器是否看到请求完成了?
  • 您需要在整个后端 PHP 脚本中添加错误记录代码。这可能是阻塞的候选者,并且由于您无法从中直观地输出任何内容,因此 error_log 是要走的路。那,以及已经建议的控制台。
  • “相同的代码在很短的等待时间内工作”,这意味着什么?页面响应需要 10 分钟,真的吗?
  • 您可以设置 $.ajax 的 timeout 选项,但请务必阅读超时文本 here
  • 如果您有 chrome,请检查开发者控制台中的 network 选项卡。你可以看看那里是否有服务器端错误...

标签: php javascript jquery ajax timeout


【解决方案1】:

我敢打赌,您的网络服务器会超时,这会使连接无效,这可能意味着没有回复任何回复。 在这种情况下,ajax 超时选项可能对您有好处。

话虽如此,如果我是你,我会采取不同的做法:既然你已经在使用 ajax,为什么不每隔 x 秒 ping 一次服务器并检查进程是否已经完成以及是时候重定向了,而不是保持连接打开了吗?这样您就不会遇到超时问题,并且您不会通过不发送任何数据而只等待服务器端进程完成的会话来保持连接。更具可扩展性和健壮性,更适合 http 连接。

【讨论】:

  • 感谢您的回答!正如所指出的,如果进程已完成,我通过每隔 x 秒询问服务器来解决问题。但是,据我了解,这仍然意味着服务器的行为使连接无效而不响应,而是让代码继续执行?我在哪里可以找到这个服务器端连接超时?如果连接被服务器关闭,我可以强制向浏览器发送内容吗?
  • 运行时间较长的进程应该在一个单独的线程中执行,而不是响应http连接的进程。这意味着对此类请求的回答应该具有“知道了,我正在处理,几秒钟后给我回电话以检查我”的含义,而不是“这是答案”。这意味着如果请求有效并且您正在寻找答案,则应立即发送简单的“OK”响应(如果使用 ajax),或者任何具有定期检查请求是否为简单 html 请求的 jsp .您不应该进入超时状态,因为
  • 对原始请求的响应是一个简单的“得到它”,无需等待实际答案。
猜你喜欢
  • 1970-01-01
  • 2019-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 2014-07-20
  • 2016-03-25
  • 1970-01-01
相关资源
最近更新 更多