带有switchMap和mergeMap的RxJS结果

时间:2020-02-03 19:52:48

标签: node.js rxjs

我正在研究RxJS;我不明白为什么mergeMap和switchMap给我相同的结果;以下源代码来自https://codeburst.io/rxjs-by-example-part-2-8c6eda15bd7f,并做了一些修改(使用了新的Observable和myObservable部分):

import { of, Observable, Observer } from 'rxjs';
import { map, mergeAll, delay, switchAll, switchMap, mergeMap, bufferCount, filter } from 'rxjs/operators';

const myObservable = new Observable((observer) => {
  observer.next(1);
  observer.next(2);
  observer.next(3);
  observer.next(4);
});
const multiplyObservable = myObservable.pipe(map((o: any) => o * 2));
const filterObservable = myObservable.pipe(filter((o: any) => o < 3));
console.log('MY_OBSERVABLE');
myObservable.subscribe(o => console.log(o));
console.log('MULTIPLY_OBSERVABLE');5
multiplyObservable.subscribe(o => console.log(o));
console.log('FILTER_OBSERVABLE');
filterObservable.subscribe(o => console.log(o));

const myAllObservable=myObservable.pipe(
    map((o: any) => o * 2),
    filter((o: any) => o < 5),
    switchMap((o: any)=> of(o+10))
    // mergeMap((o: any)=> of(o+10))
);

console.log('ALL_OBSERVABLE');
myAllObservable.subscribe(o => console.log(`myAllObservable: ${o}.`));

如果我评论switchMap并执行mergeMap,结果是否相同?为什么?

1 个答案:

答案 0 :(得分:0)

您看到的是正在发生的,因为of()总是同步发出(除非您将不推荐使用的调度程序传递给它)。同样,of()在每次订阅时立即发出其所有值。因此,无论使用mergeMap还是switchMap都没有关系,因为当switchMap取消订阅其来源的新发射时,of()已经发射了所有东西。

尝试添加of(o+10).pipe(delay(0)),我想您会发现有所不同,因为即使延迟0,这也会强制发出异步信号,而switchMap将有时间退订。