飞镖流,相当于等待

时间:2016-05-31 17:52:40

标签: dart async-await

我喜欢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()方法是什么映射到流类中的哪些实际方法。

1 个答案:

答案 0 :(得分:3)

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类的库。然后你可以导入这个文件。