【问题标题】:Dart streams, equivalent of await forDart 流,相当于 await for
【发布时间】:2016-09-29 20:49:43
【问题描述】:

我喜欢 Dart 中的 await for 构造。

如何使用常规 for 循环实现类似的功能?

有点像

// beware! fictional code.
var element = stream.next();
for(; stream.isEndReached(); element = stream.next()) {
  // use element here
}

// or probably it will be like this, right? 
var element = await stream.next();
for(; await stream.isEndReached(); element = await stream.next()) {
  // use element here
}

但我不知道在此处使用什么函数来代替 next()isEndReached()。如果您能给我一个与async for 完全一样的完整示例,那就太好了。

编辑:这是我要求这样做的实际原因:我想做这样的事情:

if (!stream.isEndReached()) {
  var a = await stream.next();
  // use a
}

if (!stream.isEndReached()) {
  var b = await stream.next();
  // use b
}

// have an arbitrary number of these

我需要像这样一件一件地消耗物品。这就是为什么我要问我的.next().isEndReached() 方法映射到流类中的哪些实际方法。

【问题讨论】:

  • 那么,使用带有 .forEach 的闭包是唯一的选择吗?我说的不可能吧?
  • 您需要将调用与then() 链接起来,以确保一个接一个地执行。我看不到使用 for 循环的方法。
  • 好吧,那些我们迫不及待的方法是什么?而不是我的 next() 和 isEndReached()
  • 不确定您上次评论的意思。你可以等待这些方法。只是 for 不提供延迟执行的方法,直到上一次迭代中的 Future 完成。当您可以只使用await for() 时,这个讨论还有什么意义?

标签: dart async-await


【解决方案1】:

async 包包含一个 StreamQueue 类,它可能会做你想做的事。

另请参阅这篇精彩的文章http://news.dartlang.org/2016/04/unboxing-packages-async-part-3.html

StreamQueue 为流提供基于拉取的 API。

从上面提到的文章中截取的代码

void main() async {
  var queue = new StreamQueue(new Stream.fromIterable([1, 2, 3]));
  var first = queue.next;
  var second = queue.next;
  var third = queue.next;
  print(await Future.wait([first, second, third])); // => [1, 2, 3]
}

更新

WebStorm(使用 dartanalyzer 的一项功能)在尚未从该包导入任何内容时不提供导入的快速修复。如果源代码中没有引用它们,它不会读取包。正如我的回答中提到的StreamQueue 来自async 包。 import 'package:async/async.dart'; 通常就足够了(将包的主入口点文件 (async.dart) 命名为与包相同的约定)并且所有导出的标识符都可以在您的库中使用。否则,您可以搜索项目的源代码,WebStorm 还将搜索依赖项并显示包含 StreamQueue 类的库。然后你就可以导入这个文件了。

【讨论】:

  • 要使用 StreamQueue,我必须找到此代码 github.com/dart-lang/async/blob/master/test/… 并将 import "package:async/async.dart" show StreamQueue; 从那里粘贴到我的导入中。我正在使用 WebStorm,并且 ctrl+space 和 StreamQueue 没有自动导入 StreamQueue。有没有更简单的方法可以开始使用 StreamQueue?
猜你喜欢
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 2012-09-23
  • 2017-07-25
  • 2020-01-29
  • 1970-01-01
相关资源
最近更新 更多