Skip to content

concatMap - Executa Cada Observable em Ordem

O operador concatMap converte cada valor no stream de entrada em um Observable e executa e concatena-os por vez. Ele não inicia o próximo Observable até que o Observable anterior seja concluído.

🔰 Sintaxe Básica e Uso

ts
import { of } from 'rxjs';
import { concatMap, delay } from 'rxjs';

of('A', 'B', 'C').pipe(
  concatMap(value =>
    of(`${value} concluído`).pipe(delay(1000))
  )
).subscribe(console.log);

// Saída (em ordem):
// A concluído
// B concluído
// C concluído
  • Converte cada valor em um Observable.
  • O próximo Observable é executado após a conclusão do Observable anterior.

🌐 Documentação Oficial RxJS - concatMap

💡 Padrões Típicos de Uso

  • Execução de requisições de API críticas para ordem
  • Processamento de tarefas baseado em fila
  • Controle de animações e UI passo a passo
  • Processo de envio de mensagens onde a ordem de envio é importante

🧠 Exemplo de Código Prático (com UI)

Este é um exemplo onde uma requisição é gerada cada vez que um botão é clicado e as requisições são sempre processadas em ordem.

ts
import { fromEvent, of } from 'rxjs';
import { concatMap, delay } from 'rxjs';

// Criar botão
const button = document.createElement('button');
button.textContent = 'Enviar Requisição';
document.body.appendChild(button);

// Área de saída
const output = document.createElement('div');
output.style.marginTop = '10px';
document.body.appendChild(output);

// Evento de clique
fromEvent(button, 'click')
  .pipe(
    concatMap((_, index) => {
      const requestId = index + 1;
      console.log(`Requisição ${requestId} iniciada`);
      return of(`Resposta ${requestId}`).pipe(delay(2000));
    })
  )
  .subscribe((response) => {
    const div = document.createElement('div');
    div.textContent = `✅ ${response}`;
    output.appendChild(div);
  });
  • Cada requisição é sempre enviada e concluída em ordem.
  • A próxima requisição é emitida após a conclusão da requisição anterior.

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