switchmap是否会自动调用订阅?

时间:2019-09-26 00:13:23

标签: rxjs

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

以下代码按预期工作,但是我只需要对此行为进行一些确认,我正在尝试在生产现场实现此目的。

我知道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

1 个答案:

答案 0 :(得分:0)

使解释更简单。当d $发出时,SwitchMap取消订阅c $。如果d发射一次并且c继续发射,您将获得d-c-c-c序列 如果d在中间再次发射,您将得到d-c-c-c-d-c-c-c

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