Pesquisa de site

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.

Artigos relacionados