Switchmap автоматически вызывает подписку? - PullRequest
0 голосов
/ 26 сентября 2019

Я пытаюсь получить такое поведение, чтобы, если текущая наблюдаемая величина изменялась, соответствующие ссылки наблюдаемой должны вызываться соответственно.

Следующий код работает как задумано, но мне просто нужна некоторая конформация относительно этогоповедение, я пытаюсь реализовать это на производственной площадке.

Я знаю, что switchMap отписывается от текущей подписки и подписывается на новую, которая была возвращена.Но он также вызывает новую наблюдаемую подписку для запуска и запуска кода, который у нее есть, или он выполняется оператором канала, или я упускаю какую-то важную концепцию?

Может кто-нибудь любезно объяснить это.Спасибо.

Вот ссылка на код стека: ::: 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');

finally -> Outputs ::: да, он вызывает allSubs

1 Ответ

0 голосов
/ 26 сентября 2019

Чтобы было проще объяснить.SwitchMap отписаться c $, когда d $ излучает.если dmitc один раз и c продолжает излучать, вы получите последовательность dccc, если d снова издаст в середине, вы получите dcccdccc

 d$
    .pipe(
      switchMap(
        data => {
          console.log("from d :: " + data);
          return c$;
        }
      )
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...