javascript - 为什么 switch 可以用作实例运算符,而 merge 和 concat 不能

标签 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 从 map 生成此可观察序列,它也可以工作:

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

是什么阻碍了实现?我很想知道潜在的限制。

提前致谢

最佳答案

我想我已经在这里看到了完全相同的问题。您不要以这种方式使用 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/

相关文章:

javascript - window.scroll 函数和删除类的奇怪行为

javascript - 压缩 JS 解码器

javascript - ngrx效果并行http调用

Angular 5 - 相当于 AngularJS 的 $interval

angular - 用 rxjs 替换两个连续的 setTimeout

javascript - 为什么函数返回未定义?

javascript - AmCharts 4 处理空数据

javascript - 在柯里化(Currying)中,为什么外部的启动函数看起来是最内部的函数?

angular - Observable.subscribe() 与带有 async/await 的 Promise

javascript - 使用 Angular 将 Firestore 数据放入数组中