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

Jak*_*ski 7 javascript ajax xmlhttprequest

我有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]
       <-/  /
           /
          /
       <-/
Run Code Online (Sandbox Code Playgroud)

我对这个问题有几个疑问.

注意:服务器端是在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

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

Vin*_*jip 0

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

就您是否在服务器端或客户端进行处理而言,这取决于您需要服务的并发客户端数量,以及您是否可以对任何响应使用缓存;在某些有大量客户端的情况下,最好将一些处理负载分给他们(当然,只要他们能够处理)。