2017-02-22 34 views
0

我是Rxjs的新手,我想知道这个问题是否可以解决。梳理多个RxJS可观察物并执行计数任务

鉴于5观察到的阵列,每个已经发出一些数据如下:

进制[0]:{ 'A', 'B', 'C'}

进制[1] :{ 'G',NULL}

进制[2]:{ '1', 'F', '3',NULL}

进制[3]:{ 'X', 'Y', 'z'}

ary [4]:{'h','v'}

我想有一个新的可观察值,用于计算这5个可观察值的非空最后一个元素的值。在上面的例子中,新观测值发出的第一个值是3(c,z,v)。

每当从一个可观察对象发出新数据时,新可观察对象也会发出计数结果。例如,当

进制[4]:{ 'H', 'V'}变为

进制[4]:{ 'H', 'V',NULL}

新观察到的会发出2(c,z)。

+0

我们可以这样描述你的数据源:https://plnkr.co/edit/e30MpsacNahHy0VUdQc7?p=preview? – Maxime

+0

如果你可以用一个小的大理石图更新你的问题,我可能会帮助:) – Maxime

回答

1

你可以使用combineLatest与随后map

const baseObs = [ 
 
    new Rx.Subject(), 
 
    new Rx.Subject(), 
 
    new Rx.Subject(), 
 
    new Rx.Subject(), 
 
    new Rx.Subject(), 
 
] 
 

 
const counter$ = Rx.Observable 
 
    .combineLatest(baseObs) 
 
    .map(dataList => dataList.filter(d => d != null).length); 
 
    
 
counter$.subscribe(
 
    num => console.log(`Num is ${num}`) 
 
); 
 

 
baseObs[0].next("a"); 
 
baseObs[1].next(null); 
 
baseObs[2].next(null); 
 
baseObs[3].next("z"); 
 
baseObs[4].next("v"); 
 

 
setTimeout(() => baseObs[4].next(null), 300);
<script src="https://unpkg.com/rxjs/bundles/Rx.min.js"></script>