dart:如何实现保留传入项目顺序的流连接?

时间:2013-06-10 07:01:35

标签: dart

我正在尝试实现一个连接运算符,它接受一个Streams列表并输出一个单独的流。问题是输出顺序与输入顺序不同。 StreamController.add是异步的,所以如果我这样做

sc1.add(1)
sc2.add(2)
sc2.add(3)
sc2.add(4)
sc1.add(5)
...

调用各个流ondata回调的顺序类似于1,2,5,3,4,它基本上是sc1和sc2的交错。这种排序在执行过程中非常一致,这使我相信实现是在单个线程上进行循环调度。 (这是飞镖VM)

如果在我的连接实现中调用ondata回调时已经对排序进行了加扰,则无法正确实现此连接。有没有人对如何实现这个有好的想法?

2 个答案:

答案 0 :(得分:2)

我相信您使用的是最新版本的SDK。

自v0.5.11以来sync构造函数引入了

SteamController标志,它控制了这种行为(请参阅文档herehere)。默认情况下,它设置为false,这意味着侦听器是异步调用的,即在add调用完成后的某个时间:

  

如果同步为假,则不会就多倍时提供保证   听众得到事件,除了每个听众都会得到所有   事件按正确顺序排列。如果在异步上发送了两个事件   控制器有两个监听器,其中一个监听器可能同时获得两个监听器   在另一个听众获得任何

之前的事件

如果你不拥有控制器,那么我不确定你能做多少。

答案 1 :(得分:0)

只有在使用命名参数add和值sync创建StreamController时,

true才是同步的。

http://api.dartlang.org/docs/releases/latest/dart_async/StreamController.html#StreamController