mergeAll 不会在空数组上发出

Mar*_*sen 6 reactive-extensions-js rxjs rxjs5

JSBIN样本

我有一组可更改的子组件(POJO 对象),每个组件都有自己的状态流。每次用户触发 addChild/removeChild/clearChildren 时,都会使用 #switchMap 发出一组新的子状态流。到目前为止,一切都很好!(对 RxJS 感到非常惊讶!)

只要不是空数组Rx.Observable.from(arrayOfStateStreams).combineAll(),我就能得到很好的结果。arrayOfStateStreams

由于这是在更高级别上组合(最新)的部分状态,因此我需要发出一个空数组,否则全局状态树将包含不再正确的旧状态数据!

我可以发出一些保留令牌,例如['EMPTY-ARRAY-PLACEHOLDER-TOKEN'],但这很奇怪。更好的方法是始终将最后一个流附加到数组中,因此最后一个索引可以被视为垃圾。但仍然令人困惑的代码和状态。使用[null]是不行的,因为我们可能有一个子状态'null'.

谁能用好的方法解决这个问题?因为#combineAll 之后不应该有其他空数组的表示,所以不能支持这一点吗?

Mar*_*sen 4

感谢github 用户 trxcllnt,他提供了以下答案

除非组合的 Observables 发出至少一个值,否则 mergeAll 不会发出,但您可以检查以确保要组合的集合是否为空,并且组合或发出一个空数组:

 var arrayOfStreamsStream = Rx.Observable
    .of(
        [], [
            Rx.Observable.of('blah-1'), // component state.
            Rx.Observable.of('blah-2'),
            Rx.Observable.of('blah-3')
        ], [], [
            Rx.Observable.of('foo-1'),
            Rx.Observable.of('qux-2')
        ]
    )
    .switchMap(function onMap(coll) {
        return coll.length === 0 ?
            Observable.of(coll) :
            Observable.combineLatest(...coll);
    })
    .subscribe(function onSubscribe(data) {
        console.log('onSubscribe START')
        console.dir(data)
        console.log('onSubscribe END')
    }) 
Run Code Online (Sandbox Code Playgroud)