2017-04-26 32 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都需要至少射擊一次在小河之前繼續。謝謝人。 –