【问题标题】:How to load an ajax (jquery) request response progressively without waiting for it to finish?如何在不等待完成的情况下逐步加载 ajax (jquery) 请求响应?
【发布时间】:2011-02-14 18:55:16
【问题描述】:

我想制作一个使用 jquery 将关键字列表提交到 php 文件的表单,根据关键字列表的大小,该文件可能需要很长时间才能加载。

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

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

【问题讨论】:

    标签: php ajax asynchronous jquery


    【解决方案1】:

    确实有办法。使用普通的旧 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?

    【讨论】:

    • 小心尝试解析部分收到的响应。此外,通常在 Web 服务器或中间缓存服务器中存在缓冲。在使用这种技术来显示 Ajax 调用的中间结果之前,我会做很多测试。
    • 我同意(缓冲部分)。我通过在服务器上明智地使用 ob_flush() 和 flush() (php) 解决了这个问题。它非常好用,因为我不需要解析任何内容,只需将输出作为纯文本获取即可。
    • 非常好。感谢您提供有关您体验的信息。
    【解决方案2】:

    最近 Josh 发布了关于 COMET 技术的文章,这似乎适合您。有几个有趣的链接,其中包含 php 中的示例。

    How do I show the print with AJAX/jQuery?

    【讨论】:

      【解决方案3】:

      更新:使用 Ajax 最可靠的方法是将每个 Ajax 请求视为原子的:它可以工作,也可以不工作。

      当你的请求正在执行时,你(页面上运行的 JS)并没有真正得到任何反馈。所以你需要多次调用。但小心点!每次调用的开销很大,大多数浏览器一次只能执行一个或两个。

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

      添加:

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

      可以使用彗星和其他“保持管道畅通”策略,但很难可靠地工作,并且往往会使用大量资源。更多的行人投票技术可以更容易上手。然后根据需要进行优化。

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2013-03-27
          • 1970-01-01
          • 1970-01-01
          • 2014-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-06
          • 1970-01-01
          相关资源
          最近更新 更多