如何动态路由RxJS流

时间:2016-10-06 19:11:11

标签: rxjs rxjs5

我有来自汽车拍卖的数据流。每个汽车拍卖都有n个车道。我想记录每辆车的拍卖。

流看起来像这样......

- {lane:1,action:bid} --- {lane:2,action:start} --- {lane:1,action:bid} --- {lane:2,action:bid} --- {lane:1,action:sold} ---

我有以下内容来缓冲每个拍卖行并关闭待售的缓冲区......

const bufferOpen$= auctionWebSocketStream$
    .filter(stream => stream.tag === 'CURITEM');

const bufferClose$ = () => auctionWebSocketStream$.filter(stream => stream.tag === 'SOLD');

auctionWebSocketStream$
  .bufferToggle(bufferOpen$, bufferClose$)
  .subscribe(x => console.log(x));

只要有一个拍卖和一个车道,上述工作就可以了。有多个车道,有关于多个车道的出价/销售信息。

如何通过通道将流聚合到缓冲区?类似的解决方案总是已知聚合参数。但是我需要随时分流,这是一条新车道。

非常感谢帮助。

更新

我制作了一个JSBin来炫耀我的沮丧和无知。它给出了一个示例输入流并解释了所需的输出。

http://jsbin.com/tuxitev/edit?js,console

(对于奖励积分,它只显示Babel下的空数组。不确定为什么需要Typescript)

1 个答案:

答案 0 :(得分:0)

如果有人知道RxJS问题的答案在哪里,请告诉我。我接受了答案。这是我第三次未回答的RxJS问题。

对于任何对答案充满好奇的人来说,就是这样。

stream$
.groupBy(stream => stream.lane)
.mergeMap(stream =>
        stream.scan((acc, cur) => {
                if (cur.action === 'start') {
                    acc = [];
                }
                acc.push(cur)
                return acc;
        }, [])
        .filter(stream => stream[stream.length-1].action === 'sold')
)
.subscribe(
    x => console.log(x), 
    (e) => console.error(e), 
    () => console.log('complete')
)

http://jsbin.com/tuxitev/edit?js,console