【问题标题】:How can I do bidirectional communication in Dart with a StreamChannel?如何在 Dart 中使用 StreamChannel 进行双向通信?
【发布时间】:2018-10-04 23:40:21
【问题描述】:

Dart Streams 有没有办法做类似的事情 await stream.first 连续多次使用流有点像堆栈/队列?

据我了解,您可以通过在现有的 Single-substription 流上使用 asBroadcastStream 来做到这一点,但我觉得这并不理想。

也许有一种带有一些 Rx 包的缓冲区原语或类似的东西?

我的用例如下:

我有一个StreamChannel (IOWebSocketChannel),我想按特定顺序发送/接收消息。

即:

Send Message0
Receive Message1
Send Message2
Receive Message3

我确信Message1 只会在服务器收到Message0 后到达 (Message2Message3 以此类推)

【问题讨论】:

    标签: stream dart


    【解决方案1】:

    Dart 的优点(在我看来也是缺点)对于基于推送的事件基于拉的资源读取具有单一抽象。这导致了一系列其他混乱,例如"Do I have to cancel stream subscriptions"

    在基于推送的模型中,例如:

    abstract class Element {
      Stream<MouseEvent> get onClick;
    }
    

    当发生点击时,您会收到类通知。可能有 0 和实际上无限的点击事件之间的任何地方,并且不希望以与读取资源相同的方式缓冲或处理它们(尤其是考虑到 Dart 是单线程的)。 另一个注意事项:让 任何 个订阅者订阅此流是完全有效的(多个类可能有兴趣知道点击何时发生)。

    另一方面,有一个基于拉的模型,例如读取文件:

    abstract class File {
      Stream<String> readLines();
    }
    

    这种情况下,您可能希望逐行处理,甚至可能在您点击某个字符串后停止,并且您肯定希望收到通知EOF(通常由“完成”事件或流关闭,在惯用的 Dart 中)。 另一个注意事项:拥有超过 1 个订阅者无效 - 这很快就会变得棘手。

    对于您的特定问题,您似乎想要:

    • 发送您自己的活动
    • 按需接收下一个事件
    • 处理事件,发送自己的事件
    • 等等……

    好的,让我们来看看你的问题的细节:


    据我了解,您可以通过在现有的 Single-substription 流上使用 asBroadcastStream 来做到这一点,但我觉得这并不理想。

    非常不理想。单订阅流(我在脑海中称这些“资源流”,就像上面的 readLines 调用)自动缓冲事件并等待订阅者。 收到一行文本真的很糟糕,因为订阅发生在文件被读取之后。

    另一方面,广播流缓冲事件。因此,如果您根据时间问题等采用您的方法,您可能会发现自己丢失发送的事件。

    这里有几个选项。没有一个是完美的,但它们可能会有所帮助:

    • package:stream_transform 包具有一组Stream 的常用转换,包括一些受 RX 启发的转换。

    • package:async 包还有其他用于处理异步代码的实用程序。具体来说,您可能会发现StreamQueue 完全符合您的要求:

      Future<void> processEvents(Stream<String> inputStream) async {
        var queue = new StreamQueue(inputStream);
        while (await queue.hasNext) {
          var next = await queue.next;
          // Insert processing here.
        }
      }
      

    我发现自己希望StreamQueue dart:async,并且在用于资源的Streams 和用于事件的流之间没有共享接口,但这今天是一个不错的方法。

    干杯!

    【讨论】:

    • 很好的答案,先生!从其他地方来到 Dart,这个答案和链接的线程真的很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多