我刚想到流式字符串是有意义的,每个字符串代表一个来自数据库查询的元素,而不是在流程结束时返回它们的整个列表,这可能会在浏览器的早期获得第一个结果。因此,我尝试使用Redstone
使用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人使用&#34;文本流&#34;在他们从Facebook获得的模式中,快速渲染页面的一部分并插入一些后者(如可用),他们在Playframework(Scala)中实现了这一点,他们使用Enumerables
,看起来就像Dart流一样。您可以在this video中看到它。
我的代码存在的问题是,我预计它会在 1秒之后显示"hello"
,而"chao"
10秒之后会显示Shelf.Response
。我得到的是 11秒等待,然后是完整的文本。如您所见,我正在使用Stream<List<int>>
回复List<int>
,其中每个hello
只是原始流中转换为字节的字符串。
这是一个货架问题/功能,还是Redstone搞砸了响应并将其转换为未来?有什么工作吗?
修改
我想要的是什么
1秒钟没什么。
1秒后
hello
chao
0:00:11.009000
11秒后
hello
chao
0:00:11.009000
我真正得到的是
1秒钟没什么。
11秒后
{{1}}