2017-10-16 4 views
1

のは、私が観測の観測可能なリストを持っているとしましょう:観測可能な観測可能な配列<boolean>と観察可能な<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. aSbjが発生するたびに新しいObservableが作成されますか?これはパフォーマンスに大きな影響を与えますか?

(コンテキスト:)

私の究極の目標は、任意の()値にブール値のリスト全体をマッピングすることです。そのような私が変更されたときにことを...

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

あなただけの 'ブール値をマップしたい場合は[ ] 'を' '' 'valueに変換すると、' 'boolean''自体は' Observable'である必要はありません。彼らがどんな理由?あなたは 'bools $ = Observable.of([false、false、false]);を実行することができます。任意の$ = bool $ .map(arr => arr.some(b => b)); ' –

+0

少し質問を抽象化しましたが、Observable が必要です。個々のブール値がトグルグループ内のトグル状態を表し、トゥルー状態が時間とともに変化するとします。 –

+1

「Observable 」のようにはまだ見えません。配列のn番目の要素がn番目のトグルの状態になっているような場合は、それら自身のサブジェクト( 'bool_subjects:Array >')を通して個々の更新をプッシュします。次にObservable.combineLatest(bool_subjects).map((bool)=> bool.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

答えをありがとう!しかし、それは私の元の質問で詳しく説明していない1つの詳細が欠けています。ブールオブザーバブルの静的リストのservable.combineLatestは、リストが時間とともに変化する可能性があるため、動作しません。 –

+0

@PeterZhangああ、少年。それはまったく別の問題です!私は 'combinedLatest()'についてのplunkerを作成しました。https://plnkr.co/edit/eQeRKHdF3Vm30EJ1raXh?p=preview –

関連する問題