3

我突然想到,流式传输字符串是有意义的,每个字符串都代表数据库查询中的一个元素,而不是在流程结束时返回它们的整个列表,这可能会更早地在浏览器上获得第一个结果。所以我试图用Redstonewhich 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
4

0 回答 0