【问题标题】:Does switchmap automatically calls the subscription?switchmap 会自动调用订阅吗?
【发布时间】:2019-09-26 12:57:28
【问题描述】:

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

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

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

【问题讨论】:

  • 该状态是错误的 switchman 改变了你可以说的时间线。但不,它不会订阅或取消订阅
  • hm, as per this website learnrxjs.io/operators/transformation/switchmap.html ****** switchMap 和其他扁平化操作符的主要区别在于取消效果。在每次发射时,先前的内部 observable(您提供的函数的结果)被取消并订阅新的 observable。你可以通过短语 switch to a new observable 记住这一点。 ******
  • 它说切换到一个新的 observable 看不到任何关于订阅的信息
  • 我什至不明白你到底在问什么,但我为你删除了管道并格式化了一下。 link
  • 谢谢你的回复,但在 stackblitz [新链接 :: stackblitz.com/edit/rxjs-uk8q3e ] 最初我没有发出任何新的 c 值,它是用 null in 启动的行为主体.. 然而,当我向 d 发出某些东西时,会触发其他值(如 c、b、a)发出 null。好想知道。如果 switchmap 触发了 c$ 订阅,尽管 c 没有发出任何内容。或 b 或 a。还是来自管道。是问题。

标签: rxjs


【解决方案1】:

为了让解释更简单。 SwitchMap 在 d$ 发出时取消订阅 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$;
        }
      )
    )

【讨论】:

  • 谢谢你的回复,但在 stackblitz [新链接 :: stackblitz.com/edit/rxjs-uk8q3e ] 最初我没有发出任何新的 c 值,它是在行为主题中以 null 启动的。但是当每当我向 d 发出某些东西时,其他值(如 c、b、a)都会触发发出 null。好想知道。如果 switchmap 触发了 c$ 订阅,尽管 c 没有发出任何内容。或 b 或 a。还是来自管道。
  • 因为您使用的是 behaviorsubject 并且它总是在您订阅时首先发出初始值,如果您将它们更改为只是简单的主题,事情就会开始变得有意义。
  • 哦,完美,有道理。谢谢你。非常。 !!
猜你喜欢
  • 2019-02-11
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-03-25
  • 1970-01-01
  • 2019-02-27
  • 2016-02-28
  • 1970-01-01
相关资源
最近更新 更多