我有一组可更改的子组件(POJO对象),每个组件都有自己的状态流。每次用户触发addChild / removeChild / clearChildren时,都会使用#switchMap发出一组新的子状态流。到现在为止还挺好! (RxJS对此感到惊讶!)
使用Rx.Observable.from(arrayOfStateStreams).combineAll()
只要arrayOfStateStreams
不是空数组,我就会得到一个好结果。
由于这是一个在更高级别上组合(最新)的部分状态,我需要发出一个空数组,否则全局状态树将包含不再正确的旧状态数据!
我可以发出一些像['EMPTY-ARRAY-PLACEHOLDER-TOKEN']
这样的保留令牌,但这很奇怪。
更好的方法是始终将最后一个流附加到数组中,以便将最后一个索引视为垃圾。仍然令人困惑的代码和状态。
使用[null]
不行,因为我们的子状态可能为'null'
。
任何能够以良好方式解决这个问题的人?不能支持这个,因为在#combineAll之后不应该有空数组的其他表示吗?
答案 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')
})