【发布时间】:2017-10-17 07:48:12
【问题描述】:
假设我有一个 Observable 的 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);
});
这似乎可行,并且能够得到我想要的结果,但我的问题是:
- 我对 switchMap 的理解正确吗?
- 这是否会在每次 aSbj 触发时创建一个新的 Observable?这会对性能产生重大影响吗?
(上下文:)
我的最终目标是将整个布尔值列表映射为 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
【问题讨论】:
-
如果您只想将
boolean[]映射到any值,则booleans 本身不需要是Observable。他们有什么理由吗?你可以做bools$ = Observable.of([false,false,false]); any$ = bools$.map(arr => arr.some(b => b)); -
我把问题抽象了一点,但是 Observable
是必要的。想象一下,单个布尔值表示一组切换中的切换状态,并且它们的状态会随着时间而变化。 -
看起来
Observable<boolean>仍然不在这里。如果数组中的第 n 个元素是第 n 个切换的状态,就像听起来一样,那么通过他们自己的主题推送各个更新:bool_subjects: Array<BehaviorSubject<bool>>。然后Observable.combineLatest(bool_subjects).map((bools) => bools.some(b => b)). -
@concat 我没有看到你的评论,并发布了一个非常相似的答案,逐步完成了这个案例。
-
@PeterZhang 但是,在您的示例中,当您使用
aSbj.next([Observable.of(true), ...触发更改时,您实际上并没有在之前的Observable<boolean>上发出新值,您只是发出了一个新的 Observable。您的真实用例如何?
标签: rxjs