【问题标题】:RxJS result with switchMap and mergeMapRxJS 结果与 switchMap 和 mergeMap
【发布时间】:2020-02-03 19:52:48
【问题描述】:

我正在学习 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,结果是一样的吗?为什么?

【问题讨论】:

  • 这个article 可能会帮助你解释它。

标签: node.js rxjs


【解决方案1】:

您所看到的正在发生,因为of() 始终同步发出(除非您将其传递给已弃用的调度程序)。此外,of() 在每次订阅时都会立即发出其所有值。因此,使用mergeMapswitchMap 并不重要,因为当switchMap 取消订阅来自其源的新发射时,of() 已经发射了所有内容。

尝试添加of(o+10).pipe(delay(0)),我认为您会看到不同,因为即使有0 延迟,这也会强制异步发射,switchMap 将有时间取消订阅。

【讨论】:

    猜你喜欢
    • 2018-09-16
    • 1970-01-01
    • 2020-05-14
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2020-03-28
    相关资源
    最近更新 更多