Rxjs switchmap是否自动调用订阅?

Rxjs switchmap是否自动调用订阅?,rxjs,Rxjs,我试图获得这样一种行为,即如果当前的可观测值发生了变化,那么应该分别调用相应的可观测值 下面的代码按预期工作,但我只需要一些关于此行为的确认,我正在尝试在生产站点上实现它 我知道switchMap从当前订阅中取消订阅,然后重新订阅返回的新订阅。 但是,它是否也调用新的observable subscribed来启动并运行它所拥有的代码,或者这是由管道操作员运行的,或者我是否遗漏了任何重要的概念 请有人澄清一下。 多谢各位 下面是stackblitz代码链接和概述 let a = new Beha

我试图获得这样一种行为,即如果当前的可观测值发生了变化,那么应该分别调用相应的可观测值

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

我知道switchMap从当前订阅中取消订阅,然后重新订阅返回的新订阅。 但是,它是否也调用新的observable subscribed来启动并运行它所拥有的代码,或者这是由管道操作员运行的,或者我是否遗漏了任何重要的概念

请有人澄清一下。 多谢各位

下面是stackblitz代码链接和概述

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以简化解释。当d$发出时,SwitchMap取消订阅c$。如果d发射一次,c继续发射,你将得到一系列的d-c-c-c 如果D在中间再次发射,则得到C-C-C-C-C-C-C<P/P>P。
 d$
    .pipe(
      switchMap(
        data => {
          console.log("from d :: " + data);
          return c$;
        }
      )
    )

使解释更简单。当d$发出时,SwitchMap取消订阅c$。如果d发射一次,c继续发射,你将得到一系列的d-c-c-c 如果D在中间再次发射,则得到C-C-C-C-C-C-C<P/P>P。
 d$
    .pipe(
      switchMap(
        data => {
          console.log("from d :: " + data);
          return c$;
        }
      )
    )

斯塔门特错了,开关工改变了你能说的时间线。但不,它不订阅或取消订阅,根据本网站******,switchMap与其他扁平化运营商的主要区别在于取消效果。在每次发射时,取消先前的内部可观测值(您提供的函数的结果),并订阅新的可观测值。你可以通过短语切换到一个新的可观察对象来记住这一点******它说切换到一个新的可观察对象,看不到任何关于订阅的内容,我甚至不明白你到底在问什么,但我为你移除了管道并设置了一点格式。感谢您的回复,但是在stackblitz[new link::stackblitz.com/edit/rxjs-uk8q3e]中,最初我没有发出任何新的c值,而是在行为主体中使用null启动的。。然而,当我向d发射某些东西时,其他值(如c、b、a)会触发发射null。真奇怪。if switchmap触发c$订阅,尽管c中没有发出任何消息。或b或a。或者是来自管道。问题是,斯塔门特错了,开关手改变了你能说的时间线。但不,它不订阅或取消订阅,根据本网站******,switchMap与其他扁平化运营商的主要区别在于取消效果。在每次发射时,取消先前的内部可观测值(您提供的函数的结果),并订阅新的可观测值。你可以通过短语切换到一个新的可观察对象来记住这一点******它说切换到一个新的可观察对象,看不到任何关于订阅的内容,我甚至不明白你到底在问什么,但我为你移除了管道并设置了一点格式。感谢您的回复,但是在stackblitz[new link::stackblitz.com/edit/rxjs-uk8q3e]中,最初我没有发出任何新的c值,而是在行为主体中使用null启动的。。然而,当我向d发射某些东西时,其他值(如c、b、a)会触发发射null。真奇怪。if switchmap触发c$订阅,尽管c中没有发出任何消息。或b或a。或者是来自管道。问题是这样的。谢谢你的回答,但是在stackblitz[new link::]中,最初我没有发出任何新的c值,它是在behavior subject中使用null启动的。。然而,当我向d发射某些东西时,其他值(如c、b、a)会触发发射null。真奇怪。if switchmap触发c$订阅,尽管c中没有发出任何消息。或b或a。或者是来自管道。这是因为您使用的是behaviorsubject,当您订阅时,它总是首先发出初始值,如果您将它们更改为普通主题,那么事情就开始有意义了。哦,太好了,有意义了。非常感谢。非常地感谢您的回复,但是在stackblitz[new link::]中,最初我没有发出任何新的c值,它是在行为主体中使用null启动的。。然而,当我向d发射某些东西时,其他值(如c、b、a)会触发发射null。真奇怪。if switchmap触发c$订阅,尽管c中没有发出任何消息。或b或a。或者是来自管道。这是因为您使用的是behaviorsubject,当您订阅时,它总是首先发出初始值,如果您将它们更改为普通主题,那么事情就开始有意义了。哦,太好了,有意义了。非常感谢。非常地