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

Javascript 如何使用其他流的值数组创建流?,javascript,rxjs,observable,Javascript,Rxjs,Observable,我试图创建一个这样的结构: +----o----> +------------o----> +-o----> +------------o----> mergeAsync() +----------------->[o, o, o, o] 我正在搜索数组中某些流的值的合并方式,我尝试合并、合并或压缩结果,但我不想使用merge/concat/zip创建新流 你知道有什么干净的方法吗 const log = (stream) => { return

我试图创建一个这样的结构:

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

mergeAsync()

+----------------->[o, o, o, o]
我正在搜索数组中某些流的值的合并方式,我尝试合并、合并或压缩结果,但我不想使用merge/concat/zip创建新流

你知道有什么干净的方法吗

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$)

我可能可以用类似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$
中,我不确定这是如何实现的…

听起来您可能想要这样的东西:

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$);


ss$是可观察对象的主题,您可以将新的可观察对象推送到它。每个观察值都是一个数字流,每次向任何流添加新元素时,都会发出一个包含所有值的新数组。这就是你想要的吗?

对我来说非常有效,可能是jsbin的一个版本@普拉文·库马尔。我在posttoArray上添加的代码仅在源流完成时生成值。这是你想要的吗?或者,您想在每次向源流添加内容时重新发出一个新的值数组吗?是的,toArray正是我不想看到的。是的,在新流中发布该数组,并继续向其中添加$1或m$之类的流,并且仍然将其添加到array.zip中的新流中,只有在所有压缩流上都有新值可用时,才会产生值。这就是你想要的吗?不,我想要的正是马特·伯内尔的建议。是的,听起来很棒。我不理解用主体代替可观察对象的意义,因为你可以在流中输入下一个值,这很好。我唯一错过的是切换,它到底在做什么?切换将可观察对象“展平”为可观察对象。它通过将任何可观测的所有元素推到相同的结果可观测中来实现这一点。它与javascript中的常规switch语句无关,不管SO的语法突出显示是什么:)如果s1$而不是observeable是Subject或behavior,会发生什么?Subject和behavior Subject都是observeable;这里的差异是由观测值是“热”还是“冷”决定的。主题为“热”,因此在主题被推到ss$之前推到主题的任何内容都将丢失。行为主体是。。。“沃米什”。。。它将重播它的最后一个值,但之前的任何内容都将丢失。Observable.range为“冷”,因此订户在订阅时接收所有值。李坎贝尔的“Rx简介”涵盖了这个主题。。。这很值得一读。