我们有 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
从 map 生成此可观察序列,它也可以工作:
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));
是什么阻碍了实现?我很想知道潜在的限制。
提前致谢
最佳答案
我想我已经在这里看到了完全相同的问题。您不要以这种方式使用 concat()
和 merge()
因为已经有 concatAll()
和 mergeAll()
运算符可以完成与您想要的完全相同的操作。
同样,也没有 switchAll()
或 switch(obs1, obs2)
。 switchAll()
没有意义,因为 switch()
已经可以处理高阶 Observables。
那么就没有 switch(obs1, obs2)
因为您可以简单地使用 .merge(obs1, obs2).switch()
来实现相同的目的。
关于javascript - 为什么 switch 可以用作实例运算符,而 merge 和 concat 不能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45119166/