如何防止XMLHttpRequest缓冲整个响应



我正在尝试使用ajax调用服务器上的流式端点。连接应该能够永远接受来自服务器的推送数据,但XMLHttpRequest似乎缓冲了整个响应。我只想让浏览器客户端接收每一块数据一次,然后继续下一块。

有什么方法可以防止这种行为吗?

更新:看起来Firefox有能力通过将XMLHttpRequest.responseType设置为"moz-chunked text"或"moz-Chucked arraybuffer"来支持这一点。但在其他浏览器中不支持。无论如何,这可能不是最好的方法。

相当于Firefox的WebKit';s";moz chunked arraybuffer"xhr响应类型

查看此wikihttp://en.wikipedia.org/wiki/Push_technology

我相信你想的是长期民意调查。在服务器将其输出设置为分块的情况下(请参阅如何使PHP生成分块响应的PHP示例)

一旦你有一个服务器发送了一个分块的响应,你就可以使用这样的东西https://github.com/flowersinthesand/portal以连续读取流。

如果您无法更改服务器传输编码,或者必须坚持使用ajax,则另一种选择是让客户端轮询服务器以获取更改。类似于(使用jQuery来缩短这个)

setInterval(function(){
   // last_updated lets you compare what's changed since the last call so you can stream updates. Or you could have the server respond with a certain amount of bytes, and then have this param remember where they are in the stream and send the next X bytes
   $.get("/my/endpoint?last_updated=" + (new Date().getTime()), function(d){
      console.log("Got response");
   });
}, 5000); // Refresh every 5 seconds

就我个人而言,我很幸运地使用了Socket.io。它是基于node.js的,但它会处理how,这样每个客户端都会获得尽可能好的性能。(在内部,它尝试使用websocket,然后重新使用flash socket,并进行轮询,这样你就可以在支持所有人的同时获得新浏览器的惊人速度)

看看这个http://en.wikipedia.org/wiki/Comet_(编程)

我有一个使用Ajax轮询服务器的网页,在那里我实现了一个Comet服务器。浏览器向服务器发送请求,只有在服务器上触发事件时(在我的情况下,当文件生成完成时)才会收到响应。如果服务器在超时(30秒)后没有响应,则会发送一个空响应。每当客户端收到Ajax响应时,它都会立即发送一个新的请求。

优点是您不需要经常轮询服务器,只要服务器上发生事件,就会立即通知您的客户端。

最新更新