将一个可观察的Observable <boolean>数组合成一个Observable <boolean []> - 我这样做了吗?

时间:2017-10-16 20:29:46

标签: rxjs

我们说我有一个可观察的Observable列表:

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

我想将a中的所有Observable组合成一个boolean []的Observable。这是我的想法(使用TypeScript):

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

这似乎有用,能够让我得到我想要的结果,但我的问题是:

  1. 我是否正确了解switchMap?
  2. 每次aSbj触发时,这会创建一个新的Observable吗?这会对性能产生重大影响吗?
  3. (上下文:)

    我的最终目标是将整个布尔列表映射到any()值:

    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
    

1 个答案:

答案 0 :(得分: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),我理解中的应该是什么,是创建一个新的observable,它“监听”所有独立的observable。它可能看起来像这样(使用combineLatest):

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

您可以将其用于map(以生成汇总结果)或直接subscribe

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

(9) aggregatedObservable.subscribe( ... );