Skip to main content

Subject | Rxjs

  • Subject | Rxjs
warning

É um tipo especial de Observable que é:

  • Observable
  • Observer

O Subject no RxJS é um tipo especial de Observable que também atua como Observer. Isso significa que ele pode tanto emitir valores (como um Observer) quanto ser observado (como um Observable).

Características principais:

  • Multicast: Diferente de um Observable comum, um Subject pode enviar valores para múltiplos Observers ao mesmo tempo.
  • Emissão manual: Você pode emitir valores usando o método .next().
  • Pode ser usado para comunicação entre componentes ou serviços em aplicações Angular.

Exemplo básico:

import { Subject } from 'rxjs';

const subject = new Subject<number>();

subject.subscribe(valor => console.log('Observer A:', valor));
subject.subscribe(valor => console.log('Observer B:', valor));

subject.next(1); // Ambos observadores recebem 1
subject.next(2); // Ambos observadores recebem 2

Existem variações do Subject, como BehaviorSubject, ReplaySubject e AsyncSubject, cada uma com comportamentos específicos.

warning

O Subject aceita um valor inicial new Subject<number>(0), caso esteja sem nenhum valor, ele não irá emitir nada até que alguém faça a chamada do .next(). Com valor inicial, ele faz uma emissão inicial

BehaviorSubject, AsyncSubject,ReplaySubject e Subject

1. Subject

  • Não armazena valor.
  • Só envia valores para quem já está inscrito.
import { Subject } from 'rxjs';

const subject = new Subject<number>();
subject.subscribe(v => console.log('A', v));
subject.next(1); // A 1
subject.subscribe(v => console.log('B', v));
subject.next(2); // A 2, B 2

2. BehaviorSubject

  • Sempre armazena o último valor emitido.
  • Novos inscritos recebem imediatamente o último valor.
import { BehaviorSubject } from 'rxjs';

const behavior = new BehaviorSubject<number>(0); // valor inicial
behavior.subscribe(v => console.log('A', v)); // A 0
behavior.next(1); // A 1
behavior.subscribe(v => console.log('B', v)); // B 1
behavior.next(2); // A 2, B 2

3. ReplaySubject

  • Armazena um buffer dos últimos valores emitidos (quantidade configurável).
  • Novos inscritos recebem os valores do buffer.
import { ReplaySubject } from 'rxjs';

const replay = new ReplaySubject<number>(2); // buffer de 2 valores
replay.next(1);
replay.next(2);
replay.next(3);
replay.subscribe(v => console.log('A', v)); // A 2, A 3
replay.next(4); // A 4

4. AsyncSubject

  • Só emite o último valor quando o Subject é completado (complete()).
import { AsyncSubject } from 'rxjs';

const async = new AsyncSubject<number>();
async.subscribe(v => console.log('A', v));
async.next(1);
async.next(2);
async.next(3);
async.complete(); // A 3