combineAll不会在空数组上发出

时间:2016-08-30 15:17:44

标签: rxjs rxjs5 reactive-extensions-js

JSBIN Sample

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

使用Rx.Observable.from(arrayOfStateStreams).combineAll()只要arrayOfStateStreams不是空数组,我就会得到一个好结果。

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

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

任何能够以良好方式解决这个问题的人?不能支持这个,因为在#combineAll之后不应该有空数组的其他表示吗?

2 个答案:

答案 0 :(得分:2)

这与combineAll无关。问题是Observable.from在传递空数组时没有任何结果(空的observable)。

如果必须从空数组中获取结果,我能想到的唯一可行解决方案是在这种情况下返回其他内容。

Ann示例说明问题和可能的解决方案。

var data = [1, 2, 3, 4, 5];

log('With data: ');
Rx.Observable.from(data)
    .subscribe(function (d) { log('data: ' + d); });

// Prints: 
// With data: 
// data: 1
// data: 2
// data: 3
// data: 4
// data: 5

var data = [];

log('Without data: ');
var nullDataObject = { msg: 'my null data object' };
Rx.Observable.from(data.length == 0 ? [nullDataObject] : data)
    .subscribe(function (d) { log('data: ' + d); });

// Prints: 
// With data: 
// data: [object Object]

jsfiddle上的可运行示例。

使用此功能时,只需在适当的位置过滤掉表示空数组的对象。

答案 1 :(得分:0)

积分转到github用户trxcllnt,他提供了以下答案:

  

combineAll不会发出,除非组合的Observables至少发出   一个值,但你可以检查以确保你收集   合并是空的或不合并,并结合或发出一个空数组:

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') })