如何写在客户端的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中抽象出来。