如何防止XMLHttpRequest缓冲整个响应

时间:2013-08-27 18:18:52

标签: javascript ajax streaming

我正在尝试对我服务器上的流端点使用ajax调用。连接应该能够永久地接受来自服务器的推送数据,但XMLHttpRequest似乎缓冲了整个响应。我只是希望浏览器客户端接收一次数据块并继续下一步。

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

更新:似乎Firefox有能力通过将XMLHttpRequest.responseType设置为“moz-chunked-text”或“moz-chunked-arraybuffer”来支持此功能。但是在其他浏览器中没有支持。无论如何,可能不是最好的方法。

WebKit equivalent to Firefox's "moz-chunked-arraybuffer" xhr responseType

2 个答案:

答案 0 :(得分:1)

查看此维基http://en.wikipedia.org/wiki/Push_technology

我相信你所想的是漫长的民意调查。服务器将其输出设置为chunked(请参阅How to make PHP generate Chunked response以获取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,但它将负责如何,因此每个客户端都将获得最佳性能。 (在内部,它尝试使用websockets并回退到闪存套接字,然后进行轮询,这样你就可以获得新浏览器的速度,同时仍然支持每个人)

答案 1 :(得分:0)

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

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

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