如何使用其他流的值数组创建流?

时间:2016-03-16 09:46:32

标签: javascript rxjs observable

我试图创建一个类似的结构:

+----o---->
+------------o---->
+-o---->
+------------o---->

mergeAsync()

+----------------->[o, o, o, o]

我正在搜索连接数组中某些流的值的方法,我试图合并,连接或压缩结果,但我不想创建一个带有merge /的新流的concat /拉链。

jsbin code snippet

你知道干净的方法吗?

const log = (stream) => {
  return stream.subscribe(
    x => console.log(x),
    e => console.log(`onError: ${e}`),
    () => console.log('onCompleted')
  )
}

let m$ = Rx.Observable.range(99, 140).take(3)
const $1 = Rx.Observable.range(0, 10).take(3)

m$ = Rx.Observable.merge($1, m$).toArray()

log(m$)

2 个答案:

答案 0 :(得分:0)

我可以使用zip来解决这个问题:

const log = (stream) => {
  return stream.subscribe(
    x => console.log(x),
    e => console.log(`onError: ${e}`),
    () => console.log('onCompleted')
  )
}

const s1 = Rx.Observable.of({key: '$1'})
const s2 = Rx.Observable.of({key: '$2'})
const s3 = Rx.Observable.of({key: '$3'})

let m$ = Rx.Observable.zip(s1, s2)

log(m$)

我删除了范围,而是使用了对象(和.of,但我可以使用.return或其他),因为对案例没有意义。

但最终,我想将s3信息流添加到m$,我不知道这是怎么回事......

答案 1 :(得分:0)

听起来你可能会遇到这样的事情:

var ss$ = new Rx.Subject();

const s1$ = Rx.Observable.range(0, 3);
const s2$ = Rx.Observable.range(10, 3)

ss$
  .switch()
  .scan((a, c) => {
    const newArray = a.slice();
    newArray.push(c);
    return newArray;
  }, [])
  .subscribe(x => console.log(x));

ss$.onNext(s1$);
ss$.onNext(s2$);

https://jsbin.com/fidowo/edit?js,console,output

ss $是可观察对象的主题,你可以将新的可观察量推向它。这些可观察对象中的每一个都是数字流,每次向任何流添加新元素时,都会发出一个包含所有值的新数组。这是你之后的事吗?