【问题标题】: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);

有什么不同吗?

【问题讨论】:

    标签: stream dart


    【解决方案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 确保正文或流中引发的错误正确传播。
    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 2017-01-29
    • 2020-08-16
    • 2014-01-21
    • 2019-08-19
    • 2020-08-25
    • 1970-01-01
    • 2012-06-11
    相关资源
    最近更新 更多