38

チャンクされた応答を生成するために、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と、表示されるデータが 1 秒ごとに増えていることがわかります。しかし、データを受信して​​処理する JavaScript 関数を作成すると、すべてのデータが受信されるまでブロックされることがわかりました。

コードは次のとおりです。

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

すべてのデータが受信された 10 秒後に、メッセージ ボックスがポップアップ表示されます。

ストリームを取得してデータを時間内に処理する方法は?

4

3 に答える 3

68

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は、累積された応答が含まれていることです。部分文字列を使用できますが、より良いアイデアは、responseType属性を使用sliceしてArrayBuffer.

于 2012-09-05T11:57:47.057 に答える
0

このsuccessイベントは、完全なデータ転送が完了し、接続が 200 応答コードで閉じられたときに発生します。onreadystatechangedネイティブイベントを実装して、データ パケットが送信されるのを確認できるはずです。

于 2012-04-24T15:35:54.303 に答える