Как распространить вложенную наблюдаемую

Скажем, я хочу подписаться на 3 наблюдаемых AB и C, где некоторый эффект зависит от результатов A и B, а некоторый эффект зависит от результатов AB и C. Я знаю, как это сделать:

      forkJoin({
      aAndB: forkJoin({
        a: of('a'),
        b: of('b')
      }).pipe(
        tap(aAndB => {
          //do something with aAndB.a and aAndB.b
        })
      ),
      c: of('c')
    }).subscribe(allthree => {
      console.log(allthree);
    });

Текущий выход:

      {
  aAndB: {
    a: 'a',
    b: 'b'
  },
  c: 'c'
}

Но мой желаемый результат состоит в том, чтобы иметь распространение/сглаживание aAndB следующим образом:

      {
  a: 'a',
  b: 'b',
  c: 'c'
}

Любой способ добиться этого?

1 ответ

я хотел бы использоватьcombineLatestдля создания независимых наблюдаемых для каждого набора значений, которые вас интересуют. Вы можете использовать одни и те же источники в каждом объявлении:

      a$ = of('a');
b$ = of('b');
c$ = of('c');

ab$  = combineLatest({ a: a$, b: b$ });
abc$ = combineLatest({ a: a$, b: b$, c: c$ });

ab$.subscribe(({a, b}) => { 
  // side effect AB 
});

abc$.subscribe(({a, b, c}) => { 
  // side effect ABC
});

Сab$иabc$оба используютa$иb$вы можете захотеть, чтобы оба подписчика использовали одну подписку ( в случае, если эти наблюдаемые выполняли какую-то работу, которую вы не хотите повторять, например, сетевой вызов ).

Вы можете выполнить это, используяshareReplay:

      a$ = of('a').pipe(shareReplay(1));
b$ = of('b').pipe(shareReplay(1));
Другие вопросы по тегам