使用AJAX或WebSockets访问部分响应?

Tho*_*mas 6 javascript ajax http websocket

我正在使用一些客户端JavaScript代码通过HTTP GET从Web服务器中提取大量JSON数据.数据量可能很大,比如50 MB.这是在局域网上,所以这不是一个问题,但它仍然需要十秒钟左右.

为了使我的界面更具响应性,我想以块的形式处理响应,一旦可用就显示UI中的数据(比方说,每MB或每秒).浏览器兼容性不是问题; 只要它适用于最新的Chrome和Firefox,它就没问题.但是,我无法修改服务器代码.

是否可以使用XMLHttpRequest或WebSockets或其他一些我没有听说过的技术来做到这一点?

XMLHttpRequest.responseText当状态为LOADING:时,显式为空

responseText属性必须返回运行这些步骤的结果:

  1. 如果状态不是LOADING或DONE返回空字符串并终止这些步骤.
  2. 返回文本响应实体主体.

但是我认为缓冲会在整个过程中的各个阶段发生,所以如果我设置定时器来定期轮询,它会起作用responseText吗?

据我所知,WebSockets也需要服务器端的特殊协议,所以这些协议已经完成.

限制:我无法修改服务器代码.

leg*_*ter 6

想发布这个评论,但评论textarea有点限制

服务器此刻是以块的形式发送数据还是连续流?如果你添加一个处理程序来xmlHttpRequestInstance.onreadystatechange触发它的频率?如果xmlHttpRequestInstance.readystate值为3,则可以获取当前值xmlHttpRequestInstance.responseText并跟踪长度.下次readystate更改时,您可以通过从该点开始获取所有新数据来获取最新数据.

我没有测试过以下内容,但希望它足够清楚:

var xhr = new XMLHttpRequest();
var lastPos = 0;
xhr.onreadystatechange = function() {
  if(xhr.readystate === 3) {
    var data = xhr.responseText.substring(lastPos);
    lastPos = xhr.responseText.length;

    process(data);
  } 
};
// then of course do `open` and `send` :)
Run Code Online (Sandbox Code Playgroud)

这当然依赖于onreadystatechange事件发射.这适用于IE,Chrome,Safari和Firefox.

  • 是的,jQuery不会让你联系到`onreadystatechange`处理程序.你必须为此绕过jQuery.这不符合规范 - heheh!这就是为什么人们会觉得这种情况(较旧的Comet技术:HTTP Long-Polling和HTTP Streaming)是一种黑客行为.你可以在这里看到一个实例:http://www.leggetter.co.uk/stackoverflow/7213549/,这里有更多细节:http://stackoverflow.com/questions/7213549/long-polling-http-streaming-一般问题/ 7347851#7347851 (2认同)