Javascript 使用AJAX或WebSocket访问部分响应?
我使用一些客户端JavaScript代码通过HTTP GET从Web服务器中提取大量JSON数据。数据量可能很大,比如50MB。这是在局域网上,所以问题不大,但仍然需要10秒钟左右 为了使我的界面更具响应性,我希望将响应分块处理,在UI中显示可用的数据(例如,每MB或每秒)。浏览器兼容性不是问题;只要能在最新的Chrome和Firefox上运行,一切都会好起来的。但是,我无法修改服务器代码 使用XMLHttpRequest、WebSockets或其他一些我从未听说过的技术,有可能做到这一点吗Javascript 使用AJAX或WebSocket访问部分响应?,javascript,ajax,http,websocket,Javascript,Ajax,Http,Websocket,我使用一些客户端JavaScript代码通过HTTP GET从Web服务器中提取大量JSON数据。数据量可能很大,比如50MB。这是在局域网上,所以问题不大,但仍然需要10秒钟左右 为了使我的界面更具响应性,我希望将响应分块处理,在UI中显示可用的数据(例如,每MB或每秒)。浏览器兼容性不是问题;只要能在最新的Chrome和Firefox上运行,一切都会好起来的。但是,我无法修改服务器代码 使用XMLHttpRequest、WebSockets或其他一些我从未听说过的技术,有可能做到这一点吗 X
XMLHttpRequest.responseText
在状态为加载时不显式为空:
responseText属性必须返回运行以下步骤的结果:
responseText
,它会起作用吗
据我所知,WebSocket在服务器端也需要一个特殊的协议,所以这些协议已经过时了
限制:我无法修改服务器代码。希望将此作为注释发布,但注释文本区域有点限制
服务器现在是以块的形式发送数据,还是一个连续的流?如果将处理程序添加到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。这可能不是一个可行的解决方案,但您可以制作第二台服务器,将数据从第一台服务器分块获取(Node.js可以非常容易地用于此),然后在接收到每个分块时立即使用WebSocket将数据发送给客户端。Node.js也有WebSockets库,所以应该不会太难。这是一个有趣的想法,但有几个原因使我无法轻松完成此操作。不幸的是,jQuery不允许我连接一个onreadystatechange
处理程序。但我怀疑它是否会起作用,因为从加载
到加载
可能不算作readyState
更改。当然,jQuery不会让您连接到onreadystatechange
处理程序。为此,您必须绕过jQuery。它不在规格中-嘿嘿!这就是为什么人们觉得这(较旧的Comet技术:HTTP长轮询和HTTP流)是一种黑客行为。你可以在这里看到一个例子:这里有更多的细节:“托马斯,你应该考虑接受这个答案,或者告诉我们为什么它不能解决你的问题。”我不记得。因为这是一个业余项目,我可能没有时间尝试这个。我相信你的话。绿色支票!