Dart流中listen和forEach有什么区别?

时间:2016-01-09 21:29:01

标签: stream dart

如果我在Dart中有Stream,我可以同时使用listenforEach,但我不了解其中的差异。

例如,请考虑以下代码:

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 个答案:

答案 0 :(得分:7)

forEach上的Stream功能会在第一个错误时停止,并且它不会给您StreamSubscription来控制您在流上的收听方式。如果您想要的话,使用forEach非常棒 - 它会告诉您何时完成(返回的Future),您只需处理事件即可。如果您需要更多控制权,可以使用listen调用,这是forEach的实施方式。

它就像Iterable.forEachIterable.iterator之间的区别 - 前者只是为每个元素调用一个回调,另一个为你提供了一种控制迭代的方法。