我喜欢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()
方法是什么映射到流类中的哪些实际方法。
答案 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
类的库。然后你可以导入这个文件。