我们说我有一个可观察的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);
});
这似乎有用,能够让我得到我想要的结果,但我的问题是:
(上下文:)
我的最终目标是将整个布尔列表映射到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
答案 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);
问题是source1
和source2
通常会创建一次,然后成为“静态流”。意思是,只要它们传递给Subject
,它们就永远不会被其他流修改。因此,Subject
只能生成一次事件,这反映了source1
和source2
的原始值。
而不是行(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( ... );