![](/img/trans.png)
[英]Is StreamController and BehaviorSubject a Stream in Dart?
[英]In Dart, why waiting for a trivial (“empty”) StreamController stream immediately exits program?
这是一个简单程序的主干,它使用 StreamController 监听一些输入 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ 并在其自己的 stream 上输出一些其他数据作为反应:
import 'dart:async';
main() async {
var c = StreamController(
onListen: (){},
onPause: (){},
onResume: (){},
onCancel: (){});
print("start");
await for (var data in c.stream) {
print("loop");
}
print("after loop");
}
Output:
$ dart cont.dart
start
$ dart
为什么这段代码在没有执行 print("loop") 和 print("after loop") 的情况下立即退出 await for 行?
注意:在原始程序中,onListen() 将接收输入 stream 并订阅它。 该循环实际上一直有效,直到在输入 stream 上调用 subscription.cancel() 时,它也突然退出,没有任何清理的机会。
我对此感到惊讶,但是所有的async/await
代码又被转换为.then()
s,似乎一切都无法完美翻译。
似乎这是答案的一部分:您需要在另一个任务中关闭 stream 才能摆脱await for
. 这是以前的相关问题。 由于我们不关闭它, await for
后的行不会执行。 这是一个避免这种情况的示例:
import 'dart:async';
main() async {
var c = StreamController(
onListen: () {},
onPause: () {},
onResume: () {},
onCancel: () {});
print("start");
await Future.wait(<Future>[producer(c), consumer(c)]);
print("after loop");
}
Future producer(StreamController c) async {
// this makes it print "loop" as well
// c.add("val!");
await c.close();
}
Future consumer(StreamController c) async {
await for (var data in c.stream) {
print("loop");
}
}
打印:
start
after loop
所以,这个故事的寓意是,
我以为我对 async/await 了如指掌,但第二点现在让我害怕了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.