流式传输函数调用在Google Dart中是异步的吗?

时间:2014-02-13 09:38:10

标签: dart dart-async

为什么dart在Step2之后调用我的函数“aFunction”?如果我在下面的控制台中执行此代码:

第二步 第一步:

我的代码:

void main()
{
 ...
 stream.listen(aFunction);
 print("Step2");
 ...
}

void aFunction()
{
 print("Step1");
}

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

Dart Stream提供的少数承诺之一是它不会响应listen调用而生成任何事件。 这些事件可能会在以后发生,但在第一个事件被触发之前,允许调用“listen”的代码继续并完成。 我们最初允许流在听取时立即触发,但是当我们尝试使用它进行编程时,在实践中完全无法控制。

聆听未来也是如此,例如'then'。回调永远不会立即发生。

事件通常应该像顶级事件循环一样触发,因此事件处理程序不必担心其他代码是否正在运行 - 其他代码可能不是可重入的。

在实践中并非总是如此。一个事件处理程序可以通过同步流控制器触发其他事件,从而有效地将一个事件转换为一个事件。这需要事件处理程序知道它在做什么。同步控制器用于内部使用,例如流变换器,并且通常不推荐使用同步流控制器。

所以,不,你不能让listen电话立即触发回调。

答案 1 :(得分:0)

如果您在启用了同步选项的情况下创建了StreamController,则可以同步收听流。以下是获得您所描述内容的示例:

var controller = new StreamController<String>(sync: true);
var stream = controller.stream.asBroadcastStream();
stream.listen((text) => print(text));
controller.add("Step1");
print("Step2");