4

在玩 Dart,尤其是dart:io库时,我发现自己用 Streams 做了一些奇怪的事情来允许多个听众。

例如,我想模拟在许多 Node 库(如 Connect & Express)中发现的处理程序堆栈模式。为此,我需要能够在请求(和响应)上设置多个侦听器,这意味着从请求中生成广播流。

这不能是我传递的唯一东西,因为它不维护请求对象的属性(例如响应)。

handleRequest (HttpRequest request) {
  var stream = request.asBroadcastStream();
  // pass stream *and* request to the handlers
}

显示问题的示例处理程序可能如下所示:

log (HttpRequest request, Stream stream) {
  DateTime start = new DateTime.now();
  stream.listen(null,
    onDone: () {
      DateTime finish = new DateTime.now();
      print("${request.method} ${request.uri} -> ${request.response.statusCode} ${finish.difference(start).inMilliseconds}ms");
    });
}

做这种事情的惯用方式是什么?我不想强迫 Dart 符合我的 JavaScriptish 方式。

4

1 回答 1

2

asBroadcastStream()方法是 Streams 中被滥用最多的方法之一。我写了一篇关于 Streams 的文章,我希望它会很快发表。简而言之:单订阅Stream的生命周期由其订阅定义,asBroadcastStream()破坏了Stream的生命周期管理。它是资源泄漏的来源。

如果您想通知程序的其他部分您从单订阅流中获得的消息,最好创建一个新的 BroadcastStream(独立于单订阅流),当消息从单订阅流到达时,您可以在其中发布消息-订阅流。如果这些需要更多信息,您应该以这种方式发送。

换句话说:创建一个新的StreamController.broadcast并与相关方分享这个。如果需要,您还可以扩展 Stream 并以这种方式提供更多信息。为自己保留单订阅流,并在共享广播流中发布有趣的信息。

单订阅流设计为由一个实体使用。

编辑:文章已在此处发表。

于 2014-01-02T20:10:30.403 回答