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

时间:2011-10-31 10:30:41

标签: 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.   
  3. 返回文本回复实体正文。
  4.   

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

据我所知,WebSockets在服务器端也需要一个特殊的协议,因此它们已经出来了。

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

1 个答案:

答案 0 :(得分:5)

想发布此评论,但评论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` :)

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