我们有3个经常使用的运算符,它们使用Observables序列 - mergeMap
,concatMap
和switchMap
。假设我有以下可观察量:
const os = [
Rx.Observable.interval(400).take(3).map((i) => `a${i}`),
Rx.Observable.interval(400).take(3).map((i) => `b${i}`),
Rx.Observable.interval(400).take(3).map((i) => `c${i}`)
];
switch
运算符可用于处理一系列可观察量:
Rx.Observable.interval(1000).take(os.length).map((i) => os[i]).switch().subscribe((v) => console.log(v));
如果使用switchMap
从地图生成此序列的可观察量,它也可以工作:
Rx.Observable.interval(1000).take(os.length).switchMap((i) => os[i]).subscribe((v) => console.log(v));
其他两个运算符mergeMap
和concatMap
也可以使用map
生成的可观察量。我也可以用它们来组合可观察量:
Rx.Observable.merge(os[0], os[1], os[2]).subscribe((v) => console.log(v));
Rx.Observable.concat(os[0], os[1], os[2]).subscribe((v) => console.log(v));
但我的问题是为什么不能像switch
那样使用它们来处理可观察量的流?
Rx.Observable.interval(1000).take(os.length).map((i) => os[i]).merge().subscribe((v) => console.log(v));
Rx.Observable.interval(1000).take(os.length).map((i) => os[i]).concat().subscribe((v) => console.log(v));
什么阻止了实施?我很想知道潜在的约束。
提前致谢
答案 0 :(得分:2)
我想我已经在这里看到了完全相同的问题。您不能以这种方式使用concat()
和merge()
,因为已经有concatAll()
和mergeAll()
运算符执行您想要的完全相同的操作。
同样,没有switchAll()
或switch(obs1, obs2)
。 switchAll()
没有意义,因为switch()
已经与更高阶的Observables一起使用。
然后没有switch(obs1, obs2)
,因为你可以简单地使用.merge(obs1, obs2).switch()
来实现同样的目标。