我正在尝试实现一个连接运算符,它接受一个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回调时已经对排序进行了加扰,则无法正确实现此连接。有没有人对如何实现这个有好的想法?
答案 0 :(得分:2)
我相信您使用的是最新版本的SDK。
自v0.5.11以来sync
构造函数引入了 SteamController
标志,它控制了这种行为(请参阅文档here和here)。默认情况下,它设置为false
,这意味着侦听器是异步调用的,即在add
调用完成后的某个时间:
如果同步为假,则不会就多倍时提供保证 听众得到事件,除了每个听众都会得到所有 事件按正确顺序排列。如果在异步上发送了两个事件 控制器有两个监听器,其中一个监听器可能同时获得两个监听器 在另一个听众获得任何
之前的事件
如果你不拥有控制器,那么我不确定你能做多少。
答案 1 :(得分:0)
add
和值sync
创建StreamController时, true
才是同步的。
http://api.dartlang.org/docs/releases/latest/dart_async/StreamController.html#StreamController