代码之家  ›  专栏  ›  技术社区  ›  Gazler

AJAX在执行完成之前返回数据

  •  0
  • Gazler  · 技术社区  · 16 年前

    我有一个正在执行AJAX请求的页面。该页面的目的是返回电子邮件的标题,我已经准备好了。问题是,这是为邮箱中的每封电子邮件调用的。这意味着它将在盒子中的每封邮件中调用一次。这是一个问题的原因,因为imap_open函数的执行时间约为1秒,因此每次调用它时,都会执行该函数。是否有一种方法可以进行AJAX调用,该调用将返回可用的信息并保持执行,以防止对执行时间较慢的函数进行多次调用?

    加兹勒。

    4 回复  |  直到 16 年前
        1
  •  1
  •   Anurag    16 年前

    批处理您的结果。在加载所有电子邮件和一次加载一封电子邮件之间,您可以批处理电子邮件标题并将其发回。调整这个数字,直到你在响应性和内容之间找到一个很好的匹配。

    在这种情况下,PHP脚本将收到一个范围请求,例如

    emailHeaders.php?start=25&end=50
    

    Javascript将以块的形式维护状态和请求数据,直到加载所有数据。或者,您可以做一些奇特的事情,比如创建关于何时请求数据以及请求什么数据的客户端策略。

    浏览器是另一个瓶颈,因为大多数浏览器在任何给定时间只允许2个传出连接。

        2
  •  2
  •   Bialecki    16 年前

    有一些技术可以让你配置你的服务器和Javascript,以允许本质上的“反向AJAX”(在Google/Wikipedia上查找“comet”或“反向AJAX”)。然而,这并不是难以置信的简单,对于你正在做的事情来说,它可能不值得所有的工作来设置它。

    我不在PHP中工作,但是如果可以在请求之间持久化imap_open的返回值或任何它的副作用,那么您应该尝试这样做,然后重用保存的资源。

    一些伪代码:

    if (!persisted_resource) {
        persisted_resource = imap_open()
    }
    
    persisted_resource.use()....
    

    其中,持久化的_资源应该是存储在会话范围、应用程序范围或PHP可用的任何比请求寿命更长的变量。

        3
  •  1
  •   Eric Mickelsen    16 年前

    听起来好像你需要处理每次通话中收到的电子邮件数量。在这一点上,您可以一起返回它们的数据,并在客户端解析出来。但是,该过程不可能永远持续下去,而且服务器无法在http请求得到响应后启动额外数据的返回,因此您必须在以后进行后续调用以处理更多电子邮件。

        4
  •  1
  •   Álvaro González    16 年前

    服务器端PHP脚本可以配置为在生成输出后立即发送输出。您基本上需要禁用所有可能导致缓冲的功能,例如 output_buffering , output_handler

    困难的部分是您需要JavaScript库能够处理部分输入。也就是说:您需要在收到下载的数据后立即访问它。我相信是的 technically possible 但是像jQuery这样的一些流行库只允许在传输完成时读取数据。

    推荐文章