Dart中的惯用流?

在使用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方式.

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

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

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

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

编辑:该文章已发布here.

点赞