2017-04-26 78 views
1

我以为我明白combineLatest,但给我的输出 - 我不理解它。我认为,当所有可观测量发出时,所有可观测量都会发出最后的值。RxJS combine最大的困惑

(注:我只是做取(5)来限制我的控制台输出)

所以,对于这个简单的例子 -

const int1$ = Rx.Observable.interval(1000).take(5) 
const int2$ = Rx.Observable.interval(500).take(5) 
const int3$ = Rx.Observable.interval(3000).take(5) 
const all$ = Rx.Observable.combineLatest(
    int1$, int2$, int3$ 
) 

all$.subscribe(latestValues => { 
    const [int1, int2, int3] = latestValues; 
    console.log(` 
     interval one @ 1000 ${int1}, 
     interval two @ 500 ${int2}, 
     interval three @ 3000 ${int3} 
    `) 
}) 

我想看到

" 
     interval one @ 1000 0, 
     interval two @ 500 1, 
     interval three @ 3000 0 
    " 
" 
     interval one @ 1000 1, 
     interval two @ 500 2, 
     interval three @ 3000 0 
    " 
" 
     interval one @ 1000 1, 
     interval two @ 500 3, 
     interval three @ 3000 1 
    " 
" 
     interval one @ 1000 2, 
     interval two @ 500 4, 
     interval three @ 3000 1 

但我越来越

" 
     interval one @ 1000 2, 
     interval two @ 500 4, 
     interval three @ 3000 0 
    " 
" 
     interval one @ 1000 3, 
     interval two @ 500 4, 
     interval three @ 3000 0 
    " 
" 
     interval one @ 1000 4, 
     interval two @ 500 4, 
     interval three @ 3000 0 
    " 
" 
     interval one @ 1000 4, 
     interval two @ 500 4, 
     interval three @ 3000 1 

有些困惑。你对我为什么没有看到我期望的东西的想法会很棒!

+0

你有jsbin吗?这将有助于玩 – user3743222

回答

2

http://reactivex.io/documentation/operators/combinelatest.html CombineLatest发出项目每当任何源可观察量发出项目

(只要每个源可观察量已发射的至少一个项目)< < == THIS

INT3是在3000毫秒之前没有发射任何物品,所以Rx等待它,然后用最新物品呼叫onNext

可能的解决方案:尝试使用计时器代替(在0秒发射第一个值,然后每发射一次)

const int1$ = Rx.Observable.timer(0,1000).take(5) 
const int2$ = Rx.Observable.timer(0,500).take(5) 
const int3$ = Rx.Observable.timer(0,3000).take(5) 
const all$ = Rx.Observable.combineLatest(
    int1$, int2$, int3$ 
) 

all$.subscribe(latestValues => { 
    const [int1, int2, int3] = latestValues; 
    console.log(` 
     interval one @ 1000 ${int1}, 
     interval two @ 500 ${int2}, 
     interval three @ 3000 ${int3} 
    `) 
}) 
+0

(只要每个源Observable已经发射至少一个物品)< - 这是<----是<这是我在我的理解中错过了......所有的obs都需要至少射击一次在小河之前继续。谢谢人。 –