typescript - rxjs - observar múltiplos observáveis, responder quando qualquer deles mudar
Eu gostaria de poder observar múltiplos observáveis e realizar alguma ação quando qualquer um deles mudar. Semelhante a como zip funciona, mas sem precisar que cada observável mude seu valor. Da mesma forma, forkJoin não é adequado, pois ele só dispara quando todos os observáveis observados tiverem disparado.
por exemplo, idealmente, quando qualquer valor observável one$, two$ ou three$ mudar, a função de inscrição deve ser acionada fornecendo o estado atual do Observable. no momento, estou usando BehavourSubject's, então o valor deve ser acessível usando BehaviourSubject.getValue()
magicCombinator(
one$,
two$,
three$,
).subscribe(([ one, two, three ]) => {
console.log({ one, two, three });
})
Existe um combinador assim?
Aqui está um stackblitz com código de exemplo caso você precise.
Código atual em funcionamento que combina os observáveis em um único fluxo e armazena em cache os resultados de cada fluxo em BehaviorSubjects.
const magicCombinator = <T = any>(...observables: Observable<T>[]) =>
new Observable((subscriber: Subscriber<T>) => {
// convert the given Observables into BehaviourSubjects so we can synchronously get the values
const cache = observables.map(toBehavourSubject);
// combine all the observables into a single stream
merge(...observables)
// map the stream output to the values of the BehavourSubjects
.pipe(map(() => cache.map(item => item.getValue())))
// trigger the combinator Observable
.subscribe(subscriber);
});
Resposta #1
Isso é o que você precisa
mesclar
Cria um Observable de saída que emite simultaneamente todos os valores de cada Observable de entrada fornecido
veja o documento de mesclagem
Você pode mesclar todos os observáveis juntos e ouvir com uma única assinatura os valores emitidos por cada um deles.
Eu gostaria de poder observar múltiplos observáveis e executar alguma ação quando qualquer um deles mudar. Semelhante a como o zip funciona, mas sem precisar que cada observável mude seu valor.
Observables não mudam de valor e não mantêm estado. Eles apenas emitem valores até completarem e então são fechados.
Se você quiser ser capaz de ter todos os valores emitidos em um determinado momento, então você deve usar o ReplaySubject. Bom artigo sobre replay subjects. Mas com isso você precisa fazer uma nova assinatura cada vez que quiser recuperar todos os valores emitidos novamente.