プロセスの最後に文字列のリスト全体を返すのではなく、それぞれがデータベース クエリの要素を表す文字列をストリーミングする方が理にかなっていると思いました。これにより、ブラウザーで最初の結果が早く得られる可能性があります。だから私はこれをRedstone
which usesで実装しようとしましたShelf
。これが私の基本的なテストです
@app.Route ('/testStream')
testSream ()
{
StreamController<String> controller = new StreamController<String> ();
() async
{
var initialTime = new DateTime.now();
await new Future.delayed (new Duration (seconds: 1));
controller.add("hello\n");
await new Future.delayed (new Duration (seconds: 10));
controller.add("chao\n");
var finalTime = new DateTime.now().difference(initialTime);
controller.add(finalTime.toString());
controller.close();
}();
Stream<List<int>> intStream = controller.stream.map((s) => s.codeUnits);
return new shelf.Response.ok (intStream);
}
いくつかのコンテキストのために、リンクされた人たちは、Facebook から取得したパターンで「テキストストリーミング」を使用して、ページの一部をすばやくレンダリングし、後者を (利用可能な場合) 挿入します。これを Playframework (Scala) で実装し、使用しますEnumerables
Dart ストリームと同じように動作するように見えます。このビデオで見ることができます。
私のコードの問題は、 1秒後と10 秒"hello"
後に表示されることを期待していたことです。私が得るのは、11 秒待ってから完全なテキストです。ご覧のとおり、aで応答しています。ここで、それぞれは、元のストリームからの文字列をバイトに変換したものです。"chao"
Shelf.Response
Stream<List<int>>
List<int>
これはシェルフの問題/機能ですか、それともレッドストーンが応答をいじって未来に変換していますか? 回避策はありますか?
編集
手に入れたいもの
1秒間何もありません。
1秒後
hello
11秒後
hello
chao
0:00:11.009000
私が本当に得るもの
1秒間何もありません。
11秒後
hello
chao
0:00:11.009000