我正在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
-在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,所以我不确定为什么{ {1}}很重要。实际上,在现实世界中,流网络变得越来越复杂,await
有时不足以确保执行顺序。这又是一个问题。
现在,我只想看看await
是否是正确的方法。预先感谢。
答案 0 :(得分:1)
code1 code2 grp1 grp2 dist_km
0 M001 M002 AAA AAA 112
3 M002 M004 AAA AAA 65
之所以与众不同,是因为任何 google.payments.inapp.getPurchases
将至少等待一个微任务-无论您等待的值是否为{{1 }} 或不。如果它是await
,它将等待其完成;如果已完成,则将等待微任务。如果您在await
之后加上Future
,它的行为将相同。
通常,Future
不知道所有侦听器何时都接收到该事件,尤其是考虑异步侦听器或Stream.asyncMap
之类的事情。
答案 1 :(得分:1)
我将为等待流完成时的操作添加一个替代答案。 await for
是我一直在寻找的钥匙。
var myStream = CustomCacheManager().getFile(_url);
File fetchedFile;
await for (var fileInfo in myStream) {
fetchedFile = fileInfo.file;
}
// stream is finished now