我突然想到,流式传输字符串是有意义的,每个字符串都代表数据库查询中的一个元素,而不是在流程结束时返回它们的整个列表,这可能会更早地在浏览器上获得第一个结果。所以我试图用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);
}
只是在某些情况下,Linked-in 人以他们从 Facebook 获得的模式使用“文本流”来快速呈现页面的某些部分并插入一些后者(如果可用),他们在他们使用的 Playframework (Scala) 中实现了这一点Enumerables
看起来就像 Dart 流一样。你可以在这个视频中看到它。
我的代码的问题是,虽然我希望它在 1 秒后显示"hello"
,10秒"chao"
后显示。我得到的是11 秒的等待,然后是完整的文本。如您所见,我Shelf.Response
用 a响应 aStream<List<int>>
其中每个List<int>
只是从原始流转换为字节的字符串。
这是货架问题/功能,还是 Redstone 弄乱了响应并将其转换为未来?有什么解决办法吗?
编辑
我想得到什么
1秒内什么都没有。
1 秒后
hello
11 秒后
hello
chao
0:00:11.009000
我真正得到的
1秒内什么都没有。
11 秒后
hello
chao
0:00:11.009000