我在Dart 2.1.0中进行编程,试图通过监听自定义流来更新某些状态:
import 'dart:async';
void main() {
final controller = StreamController<int>();
final divisibleBy2 = controller.stream.map((i) => i % 2 == 0);
var seen2x = false;
divisibleBy2.listen((y) {
seen2x = y;
});
controller.add(2);
print(seen2x);
}
当我运行它时,它会打印
false
。显然,print
函数的调用比监听器函数的调用早。状态不会及时更新。通过
await
-ing在controller.add(2)
上,我可以直接获得订单:import 'dart:async';
void main() async {
final controller = StreamController<int>();
final divisibleBy2 = controller.stream.map((i) => i % 2 == 0);
var seen2x = false;
divisibleBy2.listen((y) {
seen2x = y;
});
await controller.add(2);
print(seen2x);
}
现在,它打印
true
。监听器函数在print
之前调用。但是为什么在这种情况下
await
有所作为? StreamController's add() method不返回Future,因此我不确定await
为什么重要。实际上,在现实世界中,流网络变得越来越复杂,await
有时不足以确保执行顺序。这又是一个问题。现在,我只想看看
await
是否是正确的方法。提前致谢。 最佳答案
此处await
有所不同的原因是,任何await
都会至少等待一个微任务-不管您等待的值是否是Future
。如果它是Future
,它将等待它完成,或者等待它已经完成的微任务。如果您在await null;
之后有controller.add(2);
,则其行为将相同。
通常,StreamController
不知道所有监听器何时都接收到该事件,尤其是考虑异步监听器或 Stream.asyncMap
之类的事件时。