Dart中的惯用流?

时间:2014-01-02 15:58:05

标签: dart dart-io dart-async

在使用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符合我的JavaScript方式。

1 个答案:

答案 0 :(得分:2)

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

如果您想通知您从单一订阅流获得的邮件程序的其他部分,最好创建一个新的BroadcastStream(独立于单订阅流),当您从单订阅流。如果这些需要更多信息,您应该这样发送。

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

单订阅流旨在由一个实体使用。

修改:该文章已发布here