【发布时间】:2019-10-03 18:53:37
【问题描述】:
我正在尝试了解 Streams 并编写了一些代码。 一切似乎都正常,程序以状态码 0 退出。但是它不打印“循环完成”和“主要完成”字符串。我不知道为什么。
import 'dart:async';
Stream<int> countStream(int to) async* {
for (int i = 1; i <= to; i++) {
yield i;
}
}
class Retry {
StreamController<int> _outgoing;
Retry(Stream<int> incoming) {
_outgoing = StreamController<int>();
_outgoing.addStream(incoming);
}
Future<void> process() async {
await for (final i in _outgoing.stream) {
print("got $i");
}
print('loop done'); // Not printed
}
}
void main() async {
var stream = countStream(4);
var retry = Retry(stream);
await retry.process();
print('main done'); // Not printed
}
【问题讨论】:
-
它没有解释,但我注意到删除 main 中的
async(以及retry.process()中的await)使其按预期工作。所以它可能与异步函数在后台的实现方式有关。无论如何,这对我来说看起来非常奇怪。 -
如果您将
_outgoing设为Stream<int>而不是StreamController,它也可以工作。 -
这可能是因为流永远不会关闭,所以它一直在等待一个值,尝试在
Retry构造函数的末尾添加Timer(Duration(seconds: 10), () => _outgoing.close());,你会在 10 秒内看到消息将被打印