我使用play框架,生成分块响应。代码是:
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); } } ); });
我可以看到一个消息框弹出后10s,当所有的数据收到。
如何获取流和及时处理数据?
jQuery不支持,但你可以用普通的XHR:
var xhr = new XMLHttpRequest() xhr.open("GET","/test/chunked",true) xhr.onprogress = function () { console.log("PROGRESS:",xhr.responseText) } xhr.send()
这在all modern browsers工作,包括IE 10. W3C规范here。
这里的缺点是xhr.responseText包含累积响应。你可以使用子字符串,但更好的主意是使用responseType属性并使用ArrayBuffer上的slice。