gpt4 book ai didi

asynchronous - 在 Dart 中,如何确保流更新在继续之前完成?

转载 作者:IT王子 更新时间:2023-10-29 06:58:53 24 4
gpt4 key购买 nike

我在 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 它将等待它完成,或者如果它已经完成则等待一个微任务。如果您在 controller.add(2); 之后添加 await null;,它的行为将相同。

一般来说,StreamController 并不知道所有监听器何时都收到了事件,尤其是考虑到异步监听器或 Stream.asyncMap 之类的事情时。 .

关于asynchronous - 在 Dart 中,如何确保流更新在继续之前完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54265140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com