如何在不等待其完成的情况下,逐步加载ajax(jquery)请求响应?

5
我希望制作一个表单,使用jquery将一系列关键字提交到一个php文件中。这个文件的加载时间取决于关键字列表的大小,可能需要很长时间。
我的目标是实时将php响应加载到一个div或容器中,而不使用iframes。
所有我所知道的ajax请求都必须等待请求完成后才能访问响应,但我需要在未完成时就能访问响应,以便实时更新进度。
4个回答

5

确实有一种方法。使用普通的xmlhttp对象,我可以监视其readyState。当readyState为4时,表示请求已结束。当readyState为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:是否可能 req.readyState == 3?


在尝试解析部分接收到的响应时要小心。此外,Web服务器或中间缓存服务器通常会进行缓冲。在使用此技术显示Ajax调用的中间结果之前,建议进行大量测试。 - Larry K
1
我同意(关于缓冲部分的内容)。我通过在服务器上明智地使用ob_flush()和flush()(php)来解决了这个问题。它非常完美,因为我不需要解析任何东西,只需将输出作为纯文本获取即可。 - nc3b
非常好。感谢您分享您的经验信息。 - Larry K

1

1

更新:使用Ajax最可靠的方法是将每个Ajax请求视为原子操作:它要么成功,要么失败。

而且,当您的请求正在执行时,您(页面上运行的JS)实际上并没有得到任何反馈。因此,您需要多次调用。但是要小心!每次调用都会产生大量开销,大多数浏览器一次只能执行一个或两个调用。

我建议向人类使用繁忙指示器。您还可以显示一个倒计时时钟,每秒至少更新两次,以使其看起来像是正在发生某些事情。

添加:

您可能还想重新设计解决方案。例如,将更新过程视为批处理作业,由Ajax通过提交请求启动。然后进行进一步的Ajax调用,以了解(然后)向人类显示批处理作业的进度。

Comet和其他“保持管道打开策略”可以使用,但很难可靠地工作,并且倾向于使用大量资源。更加平凡的轮询技术可以更容易地启动。然后根据需要进行优化。


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接