2016-08-30 50 views
2

JSBIN SamplecombineAll不空數組

上發射我有一個可變集的子組件(POJO對象),每個具有其自己的狀態流。每次用戶觸發addChild/removeChild/clearChildren時,都會使用#switchMap發送一組新的子狀態流。到現在爲止還挺好! (和RxJS一樣驚訝!)

Rx.Observable.from(arrayOfStateStreams).combineAll()只要arrayOfStateStreams不是一個空數組,我會得到一個好結果。

由於這是一個在更高級別上組合(最新)的部分狀態,我需要發出一個空數組或者全局狀態樹將包含不再爲真的舊狀態數據!

我可以發出一些保留的標記,如['EMPTY-ARRAY-PLACEHOLDER-TOKEN'],但這很奇怪。 更好的方法是總是將最後一個數據流追加到數組中,這樣最後一個索引可以被認爲是垃圾。儘管如此,代碼和狀態依然令人困惑 使用[null]是不行的,因爲我們可能有一個子女狀態'null'

任何人都可以通過很好的方式解決這個問題嗎?難道這不能被支持,因爲在#combineAll之後不應該有空數組的其他表示形式嗎?

+0

這已在https://github.com/ReactiveX/rxjs/issues/1910 –

回答

0

現金去誰提供了以下答案GitHub的用戶trxcllnt:

combineAll不會散發,除非組合觀測量發射至少 一個值,但你可以檢查,以確保在收集你」重新組合 是空的或不是,或者結合或發射一個空的Array:

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

2

這與combineAll無關。問題是Observable.from在傳遞一個空數組時無結果(一個空的可觀察)。

如果您必須從空數組中獲取結果,唯一可行的解​​決方案是返回其他情況。

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上的可運行示例。

消耗此功能時,只需在適當的位置過濾表示空數組的對象即可。

+0

解決了感謝您的反饋! 這是非常真實的,它永遠不會使用空數組作爲輸入。一個更好的解決方案(和接受的答案)是繞過combineAll/combineLatest完全用三元選擇器,只要返回一個Observable.of([])如果長度=== 0。 –