Как распространить вложенную наблюдаемую
Скажем, я хочу подписаться на 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));