2013-02-10 55 views
1

我向服务器发送ajax请求,我只需要知道何时完成将用户重定向到第二页。 它正在大多数时间工作,但是如果服务器花费很长时间回答(例如10分钟),则可能发生没有回调函数被调用并且请求持续等待。jQuery ajax调用永不结束(成功和错误回调未被触发)

我的代码如下:

$.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代码在结束之前运行无错误。

我不知道在哪里寻找错误,因为我在考虑浏览器或服务器中的超时问题,但它似乎不是原因。而且,由于相同的代码在短暂的等待时间内工作,我无法想象其他可能的原因。

谢谢!

+0

网络控制台是否显示任何有趣的内容?浏览器是否看到请求完成? – 2013-02-10 16:06:44

+0

您需要在整个后端PHP脚本中添加错误日志代码。这可能是holdup的候选对象,因为你不能从视觉上输出任何东西,所以error_log是要走的路。那,和控制台已经被建议。 – 2013-02-10 16:08:11

+0

“相同的代码在短时间内工作”,这意味着什么? 10分钟的页面响应,真的吗? – 2013-02-10 16:10:45

回答

0

我敢打赌,您的Web服务器上的超时会导致连接无效,这可能意味着没有答复被发回。 在这种情况下,ajax超时选项可能对您有好处。如果我是你,我会以不同的方式做:因为你已经使用ajax,为什么不每隔一秒就ping服务器,并检查过程是否完成,是时候重定向了,而不是保持连接打开?这样您就没有超时问题,并且不会将连接锁定在不会发送任何数据的会话上,而只会等待服务器端进程完成。更具扩展性和可靠性,更适合http连接。

+0

谢谢你的回答!正如所指出的,我已经通过每隔x秒询问服务器来解决问题,如果该过程已经完成。 但据我所知,这意味着服务器的行为会使连接无效而不回应,但让代码执行继续?我在哪里可以找到这个服务器端连接超时?如果连接被服务器关闭,我可以强制将某些内容发送给浏览器吗? – sergiold 2013-02-10 21:09:29

+0

需要很长时间才能运行的进程应该在与回答http连接的进程不同的线程中执行。这意味着这样的请求的答案应该具有“得到它,我在上面,在几秒钟内打电话给我检查我”的含义,而不是“这里是答案”。这意味着如果请求有效并且您正在寻找答案,则应立即发送简单的“OK”响应(如果使用ajax),或者如果请求是简单的html请求,则具有定期检查的任何jsp 。你不应该进入超时状态,因为原始请求的 – TheZuck 2013-02-11 11:02:00

+0

响应是一个简单的“得到它”而不用等待实际的答案。 – TheZuck 2013-02-11 11:02:33