Dart 流中的 listen 和 forEach 有啥区别?
Posted
技术标签:
【中文标题】Dart 流中的 listen 和 forEach 有啥区别?【英文标题】:What is the difference between listen and forEach in Dart streams?Dart 流中的 listen 和 forEach 有什么区别? 【发布时间】:2016-04-14 10:35:19 【问题描述】:如果我在 Dart 中有Stream
,我可以同时使用listen
和forEach
,但我不明白其中的区别。
因此,例如考虑以下代码:
final process = await Process.start('pub', ['serve']);
process.stdout.map((l) => UTF8.decode(l)).forEach(print);
我也可以写:
process.stdout.map((l) => UTF8.decode(l)).listen(print);
有什么不同吗?
【问题讨论】:
【参考方案1】:Stream
上的 forEach
函数将在第一个错误处停止,它不会为您提供 StreamSubscription
来控制您在流上收听的方式。如果这是您想要的,使用forEach
非常棒 - 它会告诉您何时完成(返回的Future
),您所要做的就是处理事件。如果您需要更多控制权,可以使用listen
调用,这就是forEach
的实现方式。
这就像Iterable.forEach
和Iterable.iterator
之间的区别——前者只是为每个元素调用一个回调,另一个给你一种方法来控制迭代。
【讨论】:
说异步语法“await for (var x in stream)
”是“stream.forEach( (x) ... );
”的糖是正确的吗?
基本上,是的。由于在主体是异步的情况下await for
暂停订阅的额外要求,它并没有完全以这种方式实现,但是对于具有同步主体的简单循环,它等效于await stream.forEach((x) ... );
。前导 await
确保正文或流中引发的错误正确传播。以上是关于Dart 流中的 listen 和 forEach 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
如何比较流中的每个事件,streamController dart
关于java stream流中的peek方法和foreach的自我理解: