Subject vs BehaviorSubject em TypeScript: principais diferenças

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Subject e BehaviorSubject: dois irmãos acrobatas no mundo da programação reativa

\n\n

Se você já deu uma olhada no Stack Overflow na discussão "What is the difference between Subject and BehaviorSubject?", sabe que este tópico reúne milhares de visualizações. E não é surpresa — é uma daquelas perguntas que, mais cedo ou mais tarde, todo desenvolvedor que trabalha com RxJS em TypeScript enfrenta.

\n\n

Imagine que você está gerenciando uma transmissão ao vivo de dados. Subject é como um microfone aberto: quem se inscrever primeiro receberá tudo o que for dito depois. Já BehaviorSubject é um microfone que sempre armazena a última frase e a repete imediatamente para um novo ouvinte. Percebe a diferença?

\n\n

Neste artigo, não vamos apenas recontar a documentação. Vamos analisar casos reais, mostrar exemplos de código em TypeScript e dar regras claras de escolha. Vamos nessa!

\n\n

O que é Subject em TypeScript?

\n\n

Subject é um tipo especial de Observable que também é um Observer. Ele pode receber dados através do método next() e distribuí-los para todos os assinantes. Mas há uma nuance importante: Subject não armazena valores anteriores.

\n\n

Um exemplo simples em TypeScript:

\n\n
import { Subject } from 'rxjs';\n\nconst subject = new Subject<string>();\n\n// Inscrevendo-se depois que os dados já foram enviados\nsubject.next('Primeira mensagem');\nsubject.next('Segunda mensagem');\n\n// Este assinante não receberá nada\nsubject.subscribe({\n  next: (value) => console.log('Assinante:', value)\n});\n\n// Mas isto já será visto\nsubject.next('Terceira mensagem');\n
\n\n

O que será exibido no console? Apenas "Assinante: Terceira mensagem". As duas primeiras mensagens estão perdidas para sempre para este assinante. Esse efeito é chamado de "início frio" — você recebe apenas os dados que foram enviados após a inscrição.

\n\n

BehaviorSubject: quando é preciso lembrar do passado

\n\n

BehaviorSubject é o mesmo Subject, mas com um superpoder: ele sempre armazena o último valor e o entrega ao novo assinante imediatamente no momento da inscrição. Uma condição obrigatória é que você precisa especificar um valor inicial.

\n\n
import { BehaviorSubject } from 'rxjs';\n\nconst behaviorSubject = new BehaviorSubject<string>('Valor inicial');\n\n// Inscrevendo-se — recebe imediatamente o último valor\nbehaviorSubject.subscribe({\n  next: (value) => console.log('Primeiro assinante:', value)\n});\n\nbehaviorSubject.next('Primeira atualização');\nbehaviorSubject.next('Segunda atualização');\n\n// Este assinante receberá 'Segunda atualização' imediatamente\nbehaviorSubject.subscribe({\n  next: (value) => console.log('Segundo assinante:', value)\n});\n
\n\n

Saída no console:

\n
Primeiro assinante: Valor inicial\nPrimeiro assinante: Primeira atualização\nPrimeiro assinante: Segunda atualização\nSegundo assinante: Segunda atualização\n
\n\n

Viu? O segundo assinante recebeu imediatamente o último valor, embora tenha se inscrito depois. Esta é a principal diferença entre BehaviorSubject e Subject.

\n\n

Comparação entre Subject e BehaviorSubject: tabela de diferenças

\n\n

Vamos resumir todas as diferenças em uma tabela clara que será útil em uma entrevista ou em um projeto real.

\n\n
    \n
  • Valor inicial: Subject — não tem. BehaviorSubject — obrigatório.
  • \n
  • Armazenamento do último valor: Subject — não armazena. BehaviorSubject — armazena e entrega ao novo assinante.
  • \n
  • Comportamento em inscrição tardia: Subject — ignora todos os eventos anteriores. BehaviorSubject — entrega o último valor.
  • \n
  • Uso com Angular: Subject — para eventos (cliques, temporizadores). BehaviorSubject — para estado (dados do usuário, configurações).
  • \n
  • Método getValue(): Subject — não possui. BehaviorSubject — possui, retorna o valor atual de forma síncrona.
  • \n
\n\n

Quando usar Subject e quando usar B

Blogs

Book Recommendations