Оператор отводов - Почему Наблюдаемый, расширенный другими 2 наблюдаемыми, вызывает нажатие 2 раза вместо 1? - PullRequest
0 голосов
/ 23 ноября 2018

Из следующего кода:

const parent$ = interval(2000).pipe(
  map(x => 'parent' + x),
  tap(_ => console.log('click$'))
);

const child$ = parent$.pipe(map(x => x + ' from child 1'));
const child2$ = parent$.pipe(map(x => x + ' from child 2'));

child$.subscribe((v) => console.log(v));
child2$.subscribe((v) => console.log(v));

Я ожидал этого вывода:

click$
parent0 from child 1
parent0 from child 2
...

Вместо этого правильный вывод:

click$
parent0 from child 1
click$
parent0 from child 2
...

Почему нажмите $ tapиспускает дважды?

Реализация: https://stackblitz.com/edit/rxjs-gpxoud?devtoolsheight=60

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

чтобы лучше понять, что происходит, этот код может помочь вам

    let i = 0;
    const parent$ = interval(2000).pipe(
        map((x) => `parent ${x} - ${i++}`),
        tap((_) => console.log('click$')),
    );

    const child$ = parent$.pipe(map((x) => x + ' from child 1'));
    const child2$ = parent$.pipe(map((x) => x + ' from child 2'));

    child$.subscribe(console.log);
    child2$.subscribe(console.log);

вы видите, что родительский элемент срабатывает при каждой подписке

0 голосов
/ 23 ноября 2018

Вы получаете вывод, который у вас есть, потому что он проходит и запускает побочный эффект tap для каждой подписки.

Чтобы получить результат, который вы ожидали, вам нужно будет добавить shareReplay

const parent$ = interval(2000).pipe(
  map(x => 'parent' + x),
  tap(_ => console.log('click$')),
  shareReplay(1)
);

Таким образом, каждый подписчик на parent$ наблюдаемой «делится» излучением от parent$ наблюдаемой.Нажмите только один раз, затем.

Вы можете увидеть его в стеке блиц здесь:

https://stackblitz.com/edit/rxjs-rvymjx

...