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