2017-10-16 42 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 –

相关问题