使用Redstone / Shelf在Dart中流式传输文本

时间:2015-03-24 17:12:27

标签: dart dart-shelf redstone.dart

我刚想到流式字符串是有意义的,每个字符串代表一个来自数据库查询的元素,而不是在流程结束时返回它们的整个列表,这可能会在浏览器的早期获得第一个结果。因此,我尝试使用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}}

0 个答案:

没有答案