为什么switch可以用作实例操作符,而merge和concat则不能

时间:2017-07-15 14:16:07

标签: javascript rxjs

我们有3个经常使用的运算符,它们使用Observables序列 - mergeMapconcatMapswitchMap。假设我有以下可观察量:

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));

其他两个运算符mergeMapconcatMap也可以使用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));

什么阻止了实施?我很想知道潜在的约束。

提前致谢

1 个答案:

答案 0 :(得分:2)

我想我已经在这里看到了完全相同的问题。您不能以这种方式使用concat()merge(),因为已经有concatAll()mergeAll()运算符执行您想要的完全相同的操作。

同样,没有switchAll()switch(obs1, obs2)switchAll()没有意义,因为switch()已经与更高阶的Observables一起使用。
然后没有switch(obs1, obs2),因为你可以简单地使用.merge(obs1, obs2).switch()来实现同样的目标。