首页 > 解决方案 > switchmap 会自动调用订阅吗?

问题描述

我试图获得一种行为,即如果当前可观察的值发生变化,则应分别调用链接的相应可观察对象。

以下代码按预期工作,但我只需要关于此行为的一些确认,我正在尝试在生产站点上实现它。

我知道 switchMap 取消订阅当前订阅并重新订阅返回的新订阅。但是,它是否也调用订阅的新 observable 来启动并运行它拥有的代码,或者它是由管道操作员运行的,还是我错过了任何关键概念?

有人可以请澄清一下。谢谢你。

这是 stackblitz 代码链接 ::: https://stackblitz.com/edit/rxjs-ktnf9x :: 和概述

let a = new BehaviorSubject(null);
let b = new BehaviorSubject(null);
let c = new BehaviorSubject(null);
let d = new BehaviorSubject(null);

let a$ = a.asObservable();
let b$ = b.asObservable();
let c$ = c.asObservable();
let d$ = d.asObservable();


  d$
    .pipe(
      switchMap(
        data => {
          console.log("from d :: " + data);
          return c$;
        }
      )
    )
    .pipe(
      switchMap(
        data => {
          console.log("from c :: " + data);
          return b$;
        }
      )
    )
    .pipe(
      switchMap(
        data => {
          console.log("from b :: " + data);
          return a$;
        }
      )
    )
    .subscribe(
      data => {
        console.log("from a :: " + data);
        console.log(""); // for next line.
      }
    )



  b.next("calls");
  a.next("allSubs");

  c.next("it");
  d.next("does");

  d.next('yes');

最后 --> 输出 ::: 是的,它调用 allSubs

标签: rxjs

解决方案


为了让解释更简单。SwitchMap 在 d$ 发出时取消订阅 c$。如果 d 发射一次并且 c​​ 继续发射,您将获得一系列 dccc 如果 d 在中间再次发射,您将获得 dcccdccc

 d$
    .pipe(
      switchMap(
        data => {
          console.log("from d :: " + data);
          return c$;
        }
      )
    )

推荐阅读