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