在AJAX中处理增量服务器响应(在JavaScript中)

我有AJAX应用程序,它根据服务器响应更新页面. AJAX服务器响应所基于的命令需要很长时间才能生成完整响应,但它会在计算后立即发送部分信息.该部分响应/部分信息以“突发”发送,并且每个突发的时间和大小是不可预测的.将命令输出流式传输到Web浏览器(到AJAX请求)的CGI脚本(在Perl中)已启用autoflush.

服务器响应基于外部命令的输出. ‘time cmd> / dev / null“平均给出大约10.0秒,’time cmd | head> / dev / null’给出小于0.1秒(例如数据).所有数据都是单次调用此外部命令的结果.

情况如下所示(ASCII-art图如下):

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’吗?注意:此应用程序应该在(alomst)任何浏览器中工作.
>如何处理仅在收到完整响应后才调用onReadyStateChange的Web浏览器(JavaScript引擎)(所以我没有看到xhr.readyState == 3,即多次部分响应)?好吧,除了使用一些JavaScript框架.
>如何处理不完整的回复(在这种情况下意味着不完整的行).
>我应该发送响应结束标记,还是依靠计数器来检查我们是否收到了所有数据,还是可以依靠检测xhr.readyState == 4?

即使是部分回应也会有所帮助.

我认为 Comet是您解决方案所需的一部分.另外(如果我说得对),可以查看由Dojo Foundation实施的 Bayeux Protocol.
整个事情仍然很新(虽然有些可能是第一次HTML5实现).

除此之外,您可能必须实施轮询方法.另一个问题是,客户端JavaScript解释器可以处理多少数据.您是否有可能以某种方式“分页”您的数据,这样您就不会遇到处理请求处理的问题,而其他响应已经存在?

相关文章

JS原生Ajax操作(XMLHttpRequest) GET请求 POST请求 兼容性问题 利用iframe模拟ajax 实现表单提交的返回...
AJAX 每日更新前端基础,如果觉得不错,点个star吧 &#128515; https://github.com/WindrunnerMax/E...
踩坑Axios提交form表单几种格式 前后端分离的开发前后端, 前端使用的vue,后端的安全模块使用的SpringSe...
很早就听闻ajax的名声,但是却一直不知道怎么用,今天自己捣鼓了一下,竟然会用了,哈哈哈哈。 为了防止...
需要在服务器上进行哈 jquery的ajax方法: // jquery请求 $.ajax({ url: &quot;./server/slider.js...
Ajax函数封装ajax.js // Get / Post // 参数 get post // 是否异步 // 如何处理响应数据 // URL // var...