如何写在客户端的JavaScript来接收和parsing分块响应的时间?

我正在使用播放框架,以生成分块响应。 代码是:

class Test extends Controller { public static void chunk() throws InterruptedException { for (int i = 0; i < 10; i++) { String data = repeat("" + i, 1000); response.writeChunk(data); Thread.sleep(1000); } } } 

当我使用浏览器访问http://localhost:9000/test/chunk ,我可以看到显示的数据每秒都在增加。 但是,当我写一个JavaScript函数来接收和处理数据时,发现它将阻塞,直到所有的数据收到。

代码是:

 $(function(){ $.ajax( "/test/chunked", { "success": function(data, textStatus, xhr) { alert(textStatus); } } ); }); 

当收到所有数据时,我可以看到一个消息框在10秒后popup。

如何获得stream并及时处理数据?

jQuery不支持,但你可以用普通的XHR做到这一点:

 var xhr = new XMLHttpRequest() xhr.open("GET", "/test/chunked", true) xhr.onprogress = function () { console.log("PROGRESS:", xhr.responseText) } xhr.send() 

这适用于所有现代浏览器 ,包括IE 10 W3C规范。

这里的缺点是xhr.responseText包含一个累积的响应。 您可以使用子string,但更好的办法是使用responseType属性,并在ArrayBuffer上使用slice

当完成数据传输并且连接以200响应代码closures时, success事件将被触发。 我相信你应该能够实现一个本地onreadystatechanged事件,并看到他们来的数据包。

不,你不能。 HTTP响应的机制(包括压缩和分块)从浏览器内JavaScript中抽象出来。