2016-02-12 49 views
1

我有3個流,一個說主流s1,兩個派生流。我想獲得這個流的最新組合。派生流的最佳組合

const O = Rx.Observable 

let s1$ = O.from([1,2,3]) 
let s2$ = s1$.map(x => x*10) 
let s3$ = s1$.map(x => x*100) 

let s$ = O.combineLatest(s1$, s2$, s3$, (s1, s2, s3) => { 
    //console.log('s1, s2', s1, s2, s3) 
    return s1 + s2 + s3 
}) 

s$.subscribe(x => { 
    console.log('s = ' + x) 
}) 

輸出是:

"s = 111" 
"s = 112" 
"s = 122" 
"s = 222" 
"s = 223" 
"s = 233" 
"s = 333" 

但我想要的是:

"s = 111" 
"s = 222" 
"s = 333" 

因此,只有最後一個和形式S1和S2和S3及其衍生價值。實現它的最好方法是什麼?

小提琴: https://jsbin.com/haduvedule/edit?js,console,output

回答

1

你必須share的S1 $觀測。即你的代碼變成:

console.clear() 
const O = Rx.Observable 

let s1$ = O.from([1,2,3]).share() 
let s2$ = s1$.map(x => x*10).delay(10000) 
let s3$ = s1$.map(x => x*100) 

let s$ = O.zip(s1$, s2$, s3$, (s1, s2, s3) => { 
    //console.log('s1, s2', s1, s2, s3) 
    return s1 + s2 + s3 
}) 

s$.subscribe(x => { 
    console.log('s = ' + x) 
}) 

這是爲什麼已經被廣泛的討論SO,我鼓勵看看hot and cold observables之間的區別。這是Rx的關鍵概念,也是新來者的常見絆腳石。

+0

非常感謝,對我來說,當我需要使用'.share()'時,它仍然是一個問題,你能解釋一般情況下是否有一些規則? – WHITECOLOR

+0

按照鏈接,有一些訂閱和數據流的說明。 – user3743222