为什么 dart 在 Step2 之后调用我的函数“aFunction”?如果我在控制台中执行此代码,则以下文本:
步骤 2 步骤 1
我的代码:
void main()
{
...
stream.listen(aFunction);
print("Step2");
...
}
void aFunction()
{
print("Step1");
}
感谢帮助。
为什么 dart 在 Step2 之后调用我的函数“aFunction”?如果我在控制台中执行此代码,则以下文本:
步骤 2 步骤 1
我的代码:
void main()
{
...
stream.listen(aFunction);
print("Step2");
...
}
void aFunction()
{
print("Step1");
}
感谢帮助。
Dart Stream 做出的少数承诺之一是它不会生成任何事件来响应监听调用。事件可能会在稍后发生,但调用“listen”的代码可以在第一个事件被触发之前继续并完成。我们最初允许流在监听时立即触发,但是当我们尝试使用它进行编程时,在实践中完全无法控制。
听未来也是如此,例如使用“then”。回调永远不会立即到来。
事件通常应该像由顶级事件循环触发一样,因此事件处理程序不必担心其他代码是否正在运行 - 其他可能不可重入的代码。
在实践中并非总是如此。一个事件处理程序可以通过同步流控制器触发其他事件,有效地将一个事件变成另一个事件。这需要事件处理程序知道它在做什么。同步控制器是供内部使用的,例如流转换器,一般不推荐使用同步流控制器。
所以,不,你不能让监听调用立即触发回调。
You can listen to a stream synchronously if you created a StreamController with the sync option enabled. Here is an example to get what you describe:
var controller = new StreamController<String>(sync: true);
var stream = controller.stream.asBroadcastStream();
stream.listen((text) => print(text));
controller.add("Step1");
print("Step2");