使用AJAX或WebSockets访问部分响应



我正在使用一些客户端JavaScript代码通过HTTP GET从web服务器提取大量JSON数据。数据量可能很大,比如50mb。这是在局域网上,所以这不是什么大问题,但仍然需要10秒左右的时间。

为了使我的界面更具响应性,我希望以块的方式处理响应,在UI中显示可用的数据(例如,每MB或每秒)。浏览器兼容性不是问题;只要它能在最新的Chrome和Firefox上运行,就没问题。但是,我不能修改服务器代码。

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

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

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

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

但是我认为缓冲将在各个阶段发生,所以如果我设置一个计时器来定期轮询responseText,它会工作吗?

据我所知,WebSockets在服务器端也需要一个特殊的协议,所以这些都不在。

限制:我不能修改服务器代码

想把这个作为评论发布,但是评论文本区有点限制

服务器发送的数据是块的还是一个连续的流?如果您向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中工作。

相关内容

  • 没有找到相关文章

最新更新