Skip to content

combineLatestAll - combina os valores mais recentes do Observable interno

O operador combineLatestAll usa um Higher-order Observable (Observável de Observáveis), Uma vez que todos os Observable internos tenham sido acionados pelo menos uma vez, os Latest Values de cada um são combinados e gerados como uma Array.

Sintaxe básica e uso

ts
import { interval, of } from 'rxjs';
import { combineLatestAll, take } from 'rxjs';

// 3Dois internosObservablecomHigher-order Observable
const higherOrder$ = of(
  interval(1000).pipe(take(3)), // 0, 1, 2
  interval(500).pipe(take(4)),  // 0, 1, 2, 3
  interval(2000).pipe(take(2))  // 0, 1
);

// Todos os internosObservabletêm pelo menos1dispara uma vez, combine os valores mais recentes
higherOrder$
  .pipe(combineLatestAll())
  .subscribe(values => console.log(values));

// Saída:
// [1, 3, 0] ← Quando todos tiverem disparado pelo menos1Quando todos tiverem disparado pelo menos uma vez (após2segundos depois)
// [2, 3, 0] ← 1Quando o segundoObservableé disparado (após 2 segundos)2dispara (após3segundos depois)
// [2, 3, 1] ← 3Quando o segundoObservableé disparado (após 2 segundos)1dispara (após4segundos depois)
  • Coletar Observables internos quando o Observable de ordem superior estiver completo.
  • Comece a combinar quando todos os Observable internos tiverem disparado** pelo menos uma vez
  • Sempre que qualquer Observable interno emitir um valor, combine todos os valores mais recentes e output.

🌐 Documentação oficial do RxJS - combineLatestAll

💡 Padrão de utilização típico.

  • Combinar os resultados mais recentes de várias chamadas de API
  • Sincronizar os valores mais recentes de várias entradas de formulário
  • Integrar várias fontes de dados em tempo real**

Exemplos práticos de código

Exemplo de combinação dos resultados mais recentes de várias chamadas de API

ts
import { of, timer, Observable } from 'rxjs';
import { map, combineLatestAll, take } from 'rxjs';

const output = document.createElement('div');
document.body.appendChild(output);

// 3Dois simuladosAPIChamada de criação (Higher-order Observable)
const apiCalls$: Observable<Observable<string>> = of(
  // API 1: Informações do usuário (1Concluído em segundos,3atualizado uma vez)
  timer(0, 1000).pipe(
    take(3),
    map(n => `Usuário: User${n}`)
  ),
  // API 2: Número de notificações (0.5Concluído em segundos,4atualizado uma vez)
  timer(0, 500).pipe(
    take(4),
    map(n => `Notificações: ${n}Número de notificações`)
  ),
  // API 3: Status2Concluído em segundos,2atualizado uma vez)
  timer(0, 2000).pipe(
    take(2),
    map(n => n === 0 ? 'Status: Off-line' : 'Status: Online')
  )
);

// Todas as chamadasAPIValor mais recente combinado de chamadas
apiCalls$
  .pipe(combineLatestAll())
  .subscribe(values => {
    output.innerHTML = '<strong>Status mais recente:</strong><br>';
    values.forEach((value, index) => {
      const item = document.createElement('div');
      item.textContent = `${index + 1}. ${value}`;
      output.appendChild(item);
    });
  });
  • Três chamadas de API são executadas em paralelo.
  • Depois de todas terem sido disparadas pelo menos uma vez**, os resultados combinados são exibidos
  • Sempre que qualquer API for atualizada, a última combinação será exibida

Creation Function relacionada

No entanto, a função combineLatestAll é usada principalmente para achatar Observable de ordem superior, Use a Creation Function combineLatest para combinações normais de Observables de várias ordens.

ts
import { combineLatest, interval } from 'rxjs';

// Creation FunctionEdição (uso mais geral)
const combined$ = combineLatest([
  interval(1000),
  interval(500),
  interval(2000)
]);

combined$.subscribe(console.log);

Consulte Capítulo 3 Creation Function - combineLatest.

🔄 Operadores relacionados.

Operador.Descrição.
mergeAllAssina todos os Observable internos em paralelo.
concatAllAssinar os Observable internos em sequência.
switchAllMudar para um novo Observable interno.
zipAllEmparelhar os valores de cada Observable interno na ordem correspondente

⚠️ Notas.

O Observable de ordem superior deve ser preenchido.

O combineLatestAll aguarda a coleção de Observables internos até que o Observable de ordem superior (Observable externo) seja completado.

❌ O Observable de ordem superior não é concluído, portanto, nada é gerado.

ts
interval(1000).pipe(
  map(() => of(1, 2, 3)),
  combineLatestAll()
).subscribe(console.log); // Nada é emitido

✅ Take to complete

ts
interval(1000).pipe(
  take(3), // 3Concluído em uma sessão
  map(() => of(1, 2, 3)),
  combineLatestAll()
).subscribe(console.log);

Todos os Observable internos devem disparar pelo menos uma vez

Nenhum valor é gerado até que todos os Observable internos tenham sido acionados pelo menos uma vez.

ts
// 1Se qualquer um dos status internosObservableNada é emitido se houver
of(
  of(1, 2, 3),
  NEVER // Nunca dispara para sempre.
).pipe(
  combineLatestAll()
).subscribe(console.log); // Nada é emitido

Uso de memória.

Observe o uso de memória se houver muitos Observable internos, pois os valores mais recentes de todos os Observable internos são mantidos na memória.

Lançado sob a licença CC-BY-4.0.