在使用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方式。
答案 0 :(得分:2)
asBroadcastStream()
方法是Streams最滥用的方法之一。我已经写了一篇关于Streams的文章,我希望它很快就会发布。简而言之:单订阅Stream的生命周期由其订阅定义,而asBroadcastStream()
会破坏Stream的生命周期管理。它是资源泄漏的来源。
如果您想通知您从单一订阅流获得的邮件程序的其他部分,最好创建一个新的BroadcastStream(独立于单订阅流),当您从单订阅流。如果这些需要更多信息,您应该这样发送。
换句话说:创建一个新的StreamController.broadcast
并与感兴趣的各方分享。如果需要,您还可以扩展Stream并以这种方式提供更多信息。保留单订阅流,并在共享广播流中发布有趣的信息。
单订阅流旨在由一个实体使用。
修改:该文章已发布here。