将可观测数组Observable 与Observable 相结合 - 我正在做对吗?
比方说,我有可观察的可观察名单:将可观测数组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);
});
这似乎是工作,是能够让我我想要的结果,但我的问题是:
- 我是否理解正确switchMap?
- 这是否每次创建一个新的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
我希望我不会误解你的问题。我认为,有这样一个主题是一个大问题。下面是用行号代码:
(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);
的问题是,source1
和source2
通常创建一次,然后成为“静流”。意思是,只要它们传递到Subject
,它们将永远不会被其他流修改。因此,Subject
可能只产生一次事件,这反映了来自source1
和source2
的原始值。
不是行(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(...);
@ peter-zhang是否回答您的问题? –
感谢您的回答!但是,它确实遗漏了我在原始问题中未详细阐述的一个细节。 servable.combineLatest在布尔Observable的静态列表上不起作用,因为列表可以随时间变化。 –
@PeterZhang哦,男孩。那是一个完全不同的问题! :(我甚至创建了一个关于'combineLatest()'https://plnkr.co/edit/eQeRKHdF3Vm30EJ1raXh?p=preview –
如果你只是想图个'布尔[ ]'到一个_'anyany'值,'boolean''本身不需要是'Observable'。他们是什么原因?你可以做'bools $ = Observable.of([false,false,false]);任何$ = bools $ .map(arr => arr.some(b => b));' –
我抽象了一些问题,但Observable是必要的。想象一下,单个布尔代表在一组切换中表示切换状态,并且其状态随着时间而改变。 –
它仍然不像'Observable'就在这里。如果数组中的第n个元素是它听起来的第n个切换的状态,那么通过它们自己的主题推送各个更新:'bool_subjects:Array >'。然后'Observable.combineLatest(bool_subjects).map((bools)=> bools.some(b => b))''。 –
concat