2016-02-12 65 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