【问题标题】:How to cancel subscription of the original stream after timeout in Dart?Dart超时后如何取消订阅原始流?
【发布时间】:2021-11-25 21:55:29
【问题描述】:

我有一个超时订阅的广播流:

final s = originBroadcast.timeout(timeout, onTimeout: (sink) => sink.close());
await for (final event in s) {
  ...
}

问题是timeout() 创建了另一个流(s),当我取消订阅或出现超时时,它不会取消原始流(originBroadcast)。可以这样做吗?

【问题讨论】:

    标签: flutter dart dart-stream


    【解决方案1】:

    我找到了解决方法:

    final s = originBroadcast.timeout(
      timeout,
      onTimeout: (sink) => sink.close(),
    );
    s.listen((event) {...});
    

    【讨论】:

    • 你不能用await subscription.cancel()代替sink.close()吗? Stream.timeout 的文档说:“在传递给 onTimeout 的接收器上调用 EventSink.close 会关闭返回的流,并且不再处理任何事件。”
    • 是的,作为一个选项。但是对await for不起作用,很奇怪。
    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2016-07-27
    • 1970-01-01
    • 2022-01-19
    • 2012-03-14
    • 2020-04-07
    相关资源
    最近更新 更多