2010-05-02 98 views
4

我想制作一个表单,它将使用jquery将关键字列表提交给php文件,根据关键字列表的大小,此文件可能需要很长时间才能加载。如何逐渐加载ajax(jquery)请求响应而无需等待它完成?

我想要做的是将php响应实时加载到div或容器中,而无需使用iframe。

我知道的所有ajax请求都必须等到请求完成才能访问响应,即使尚未完成,我也需要访问该响应,以便实时更新进度。

回答

4

确实有办法。用简单的旧xmlhttpobjects我监控readyState。就绪状态4表示请求已结束。就绪状态3意味着我可以得到一些输出,并等待更多:

request.onreadystatechange=function() 
{ 
    switch(request.readyState) 
    { 
     case 4: 
      console.log("all good things come to an end"); 
     break; 
     case 3: 
      console.log("o, hai!" + request.responseText); 
     break; 
    } 
} 

我相信你可以实现使用jQuery相同:jQuery: Is req.readyState == 3 possible?

+0

小心试图解析一个部分收到的响应。此外,网络服务器或中级高速缓存服务器上经常存在缓冲。在使用这种技术来显示来自Ajax调用的中间结果之前,我会做很多测试。 – 2010-05-02 16:05:42

+1

我同意(与缓冲部分)。我通过在服务器上正确使用ob_flush()和flush()(php)来解决这个问题。它的工作原理_beautifully_,因为我不需要解析任何东西,只需将输出作为纯文本输出即可。 – nc3b 2010-05-02 16:11:35

+0

非常好。感谢您的经验信息。 – 2010-05-02 18:42:57

0

这听起来像你需要使用多个较小的请求,而不是一个大的请求。

1

更新:使用Ajax最可靠的方法是考虑每一个Ajax请求为原子:它的工作或没有。

而你(在页面上运行的JS)并没有真正得到任何反馈,因为你的请求正在执行。所以你需要多次通话。不过要小心!每次通话的开销很大,大多数浏览器一次只能执行一个或两个。

我建议使用一个繁忙的指标给人类。您还可以显示一个倒计时钟,每秒至少更新两次,使其看起来像是发生了什么事情。

已添加:

您可能还希望重新构建解决方案。例如,将更新过程视为Ajax通过提交请求启动的批处理作业。然后进一步进行Ajax调用以学习(然后)将批处理作业的进度显示给人员。

彗星和其他“保持管道开放策略”可以使用,但很难得到可靠的工作,并倾向于使用大量的资源。一个更行人的投票技术可能会更容易。然后如果需要优化。