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

14

如果我在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个回答

13
在`Stream`上使用`forEach`函数会在第一个错误处停止,而且它不会给你一个`StreamSubscription`来控制如何监听流。如果这是你想要的,使用`forEach`是很好的——它告诉你什么时候完成(返回的`Future`),你所需要做的就是处理事件。如果你需要更多的控制,你可以使用`listen`调用,这就是`forEach`的实现方式。
这就像`Iterable.forEach`和`Iterable.iterator`之间的区别——前者只为每个元素调用一个回调,后者提供了一种控制迭代的方法。

1
使用异步语法"await for (var x in stream) {}"来代替"stream.forEach( (x) { ... } );"是正确的吗? - Ganymede
1
基本上是这样的。由于“await for”暂停订阅(如果主体是异步的)的额外要求,它并不完全实现这种方式,但对于一个具有同步主体的简单循环来说,它等效于“await stream.forEach((x) { ... });”。前导的“await”确保在主体或流中引发的错误被正确传播。 - lrn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接