如果我在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);
有什么不同吗?
答案 0 :(得分:7)
forEach
上的Stream
功能会在第一个错误时停止,并且它不会给您StreamSubscription
来控制您在流上的收听方式。如果您想要的话,使用forEach
非常棒 - 它会告诉您何时完成(返回的Future
),您只需处理事件即可。如果您需要更多控制权,可以使用listen
调用,这是forEach
的实施方式。
它就像Iterable.forEach
和Iterable.iterator
之间的区别 - 前者只是为每个元素调用一个回调,另一个为你提供了一种控制迭代的方法。