2017-10-16 66 views
1

比方說,我有可觀察的可觀察名單:將可觀測數組Observable <boolean>與Observable <boolean[]>相結合 - 我正在做對嗎?

const a = [Observable.of(false), Observable.of(false)]; 
const aSbj: Observable<Array<Observable<boolean>>> = new BehaviorSubject(a); 

我想所有的觀測量,結合內部成可觀察布爾[]的。這是我的想法(使用打字稿):

const listObs = aSbj 
    .switchMap((observables: Array<Observable<boolean>>) => { 
     return Observable.combineLatest(...observables); 
    }); 

這似乎是工作,是能夠讓我我想要的結果,但我的問題是:

  1. 我是否理解正確switchMap?
  2. 這是否每次創建一個新的Observable aSbj都會觸發?這是否會對性能產生重大影響?

(背景:)

我的最終目標是布爾的整個列表映射到任何()值:

const anyObs = listObs.map((booleans) => { 
    return booleans.some(i => i) 
}); 

...這樣,當我改變aSbj,anyObs會發出正確的值:

const any; 
anyObs.subscribe((anyVal) => any = anyVal); // any == false 
aSbj.next([Observable.of(true), Observable.of(false)]); 
// any == true 
+2

如果你只是想圖個'布爾[ ]'到一個_'anyany'值,'boolean''本身不需要是'Observable'。他們是什麼原因?你可以做'bools $ = Observable.of([false,false,false]);任何$ = bools $ .map(arr => arr.some(b => b));' –

+0

我抽象了一些問題,但Observable 是必要的。想象一下,單個布爾代表在一組切換中表示切換狀態,並且其狀態隨着時間而改變。 –

+1

它仍然不像'Observable '就在這裏。如果數組中的第n個元素是它聽起來的第n個切換的狀態,那麼通過它們自己的主題推送各個更新:'bool_subjects:Array >'。然後'Observable.combineLatest(bool_subjects).map((bools)=> bools.some(b => b))''。 – concat

回答

0

我希望我不會誤解你的問題。我認爲,有這樣一個主題是一個大問題。下面是用行號代碼:

(1) const source1 = Observable.of(false); 
(2) const source2 = Observable.of(false); 

(3) const independentObservables = [source1, source2]; 

(4) const subject: Observable<Observable<boolean>[]> = 
(5) new BehaviorSubject(independentObservables); 

的問題是,source1source2通常創建一次,然後成爲「靜流」。意思是,只要它們傳遞到Subject,它們將永遠不會被其他流修改。因此,Subject可能只產生一次事件,這反映了來自source1source2的原始值。


不是行(4), (5),應該做在我的理解什麼的,是一個新的觀察到其「偵聽」所有獨立的觀測創造。它可能看起來像這樣(使用combineLatest):

(6) const watchingObservable = Observable.combineLatest(...independentObservables); 

你直接用它來map(以產生聚合結果)或subscribe

(7) const aggregatedObservable: Observable<boolean> = 
(8) watchingObservable.map(values => values.some(Boolean)); 

(9) aggregatedObservable.subscribe(...); 
+0

@ peter-zhang是否回答您的問題? –

+0

感謝您的回答!但是,它確實遺漏了我在原始問題中未詳細闡述的一個細節。 servable.combineLatest在布爾Observable的靜態列表上不起作用,因爲列表可以隨時間變化。 –

+0

@PeterZhang哦,男孩。那是一個完全不同的問題! :(我甚至創建了一個關於'combineLatest()'https://plnkr.co/edit/eQeRKHdF3Vm30EJ1raXh?p=preview –

相關問題