小编典典

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

ajax

我正在使用一些客户端JavaScript代码通过HTTP GET从Web服务器提取大量JSON数据。数据量可能很大,例如50
MB。这是在LAN上,因此这不是什么大问题,但仍然需要十秒钟左右。

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

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

XMLHttpRequest.responseText当状态为时,它不是显式为空LOADING

responseText属性必须返回运行以下步骤的结果:

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

但是我认为缓冲会在此过程的各个阶段进行,所以如果我设置了一个定期轮询的计时器,它将起作用responseText吗?

据我所知,WebSocket在服务器端也需要特殊的协议,因此这些协议已经淘汰了。

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


阅读 282

收藏
2020-07-26

共1个答案

小编典典

想要将其发布为评论,但评论文本区域有些限制

服务器现在是分块发送数据还是是一个连续流?如果将处理程序添加到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中运行。

2020-07-26