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,我可以同时使用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】:

Stream 上的 forEach 函数将在第一个错误处停止,它不会为您提供 StreamSubscription 来控制您在流上收听的方式。如果这是您想要的,使用forEach 非常棒 - 它会告诉您何时完成(返回的Future),您所要做的就是处理事件。如果您需要更多控制权,可以使用listen 调用,这就是forEach 的实现方式。

这就像Iterable.forEachIterable.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的自我理解:

Dart:让流中抛出的异常传播并在调用者中捕获它

7.Dart中的函数 箭头函数 匿名函数 闭包

在 Dart / Flutter 的 Firestore 查询中添加限制时,不会调用 Stream Listen

Dart - 是不是可以更改 future.forEach。到地图?