2009-07-20 62 views
6

我有基于服务器响应更新页面的AJAX应用程序。 AJAX服务器响应所基于的命令需要很长时间才能生成完整响应,但一旦计算完成,它就会发送部分信息。该部分响应/部分信息以“突发”发送,并且每个突发的时间和大小是不可预知的。将命令输出流式传输到Web浏览器(对AJAX请求)的CGI脚本(在Perl中)启用了自动刷新功能。在AJAX中处理增量服务器响应(在JavaScript中)

服务器响应基于外部命令的输出。虽然'time cmd>/dev/null'的平均时间约为10.0秒,'time cmd | head>/dev/null'的时间少于0.1秒(例如数据),所有的数据都是单次调用这个外部命令的结果。

的情况如下所示(ASCII艺术图如下)

client |  | server 
---------  --------- 

request -\ 
      \ 
      \ 
      \ 
      \-> 

      /- response 
      / . 
     /  . 
     //- . 
     <-// . 
     /  . 
     //- [end] 
     <-//
     /
     /
     <-/ 

我对这个问题的一些问题

注:服务器端为已完成Perl中的CGI脚本,我宁愿看到(也)没有你的解决方案像jQuery一样唱歌JavaScript库/框架。

  • AJAX应用服务器端使用的命令的输出是基于行的。每一组行以一种定义的行开始,并以其他种类的行结尾,由独立和不可更改的数据组成。我是否应该将命令的响应作为'text/plain'并在客户端使用JavaScript进行处理,还是应该在服务器上预处理数据,并使用'application/json'mimetype将整个数据块作为JSON发送?

  • 可能发生的情况是,服务器一次发送的大块数据很快就会被另一块数据发送。 onreadystatechange处理程序在前一次调用未完成时调用时如何处理情况?我应该使用全局变量作为信号量,还是传递状态变量作为处理程序参数(以及使用xhr.onreadystatechange = function() { handleRequest(xhr, state) })?

  • 我应该使用'text/plain'还是'application/json',或者可能是'multipart/x0mixed-replace'?注意:这个应用程序应该在任何浏览器中运行。

  • 如何处理仅在收到完整响应后调用onReadyStateChange的Web浏览器(JavaScript引擎)(所以我没有看到xhr.readyState == 3,即部分响应不止一次)?那么,除了使用一些JavaScript框架。

  • 如何处理不完整的答案(在这种情况下意味着不完整的行)。

  • 我应该发送响应标记的结束还是依靠计数器来检查我们是否收到所有数据,或者我可以简单地依靠检测xhr.readyState == 4

即使部分响应也会有帮助。

回答

0

我认为客户端可以设计为处理数据块,发送重复的AJAX请求,直到提供所有数据。这假定即使整个响应很大,每个块都可以及时发送(没有客户端超时问题);并且这种设计可能比开发针对特定的部分响应状态的检查更简单,这些状态可能因浏览器而异。

根据你是否处理服务器端或客户端,这取决于例如,您需要维护多少个并发客户端,以及您是否可以使用缓存来处理任何响应;在一些有很多客户的情况下,最好将一些处理负载分配给他们(当然,只要他们能处理它)。

+1

重复AJAX请求(长轮询策略)的问题是数据是由_single_命令生成的,所以AJAX的服务器部分必须保存状态/记住客户端/传递状态以发送更多请求。 – 2009-07-20 21:58:11

1

我认为Comet是您所需解决方案的一部分。你可以另外(如果我有这个权利)结帐由Dojo基金会实施的Bayeux Protocol。整个事情还是非常新的(尽管其中的一些可能是第一个HTML5实现的可能)。

除此之外,您可能必须实施轮询方法。另一个问题是,客户端JavaScript解释器可以处理多少数据。你有没有可能以某种方式“分页”你的数据,这样你就不会有处理请求的问题仍然处理,而另一个响应已经进入?