派生流的最新组合

Lasest combination of derived streams

我有 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"

所以只有 last 和 s1 及其从 s2 和 s3 派生的值。实现它的最佳方法是什么?

一个fiddle: https://jsbin.com/haduvedule/edit?js,console,output

你必须 share s1$ observable。即您的代码变为:

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 上进行了广泛讨论,我鼓励看一下 之间的区别。它是 Rx 的关键概念,也是新手常见的绊脚石。