Observable and Subject in RxJS

1. Observable

An Observable is a stream of data that you can subscribe to. It’s cold by default, meaning it doesn’t emit values until someone subscribes.

Example:

import { Observable } from 'rxjs';

const observable = new Observable<number>((subscriber) => {
  subscriber.next(1);
  subscriber.next(2);
  subscriber.next(3);
  subscriber.complete(); // completes the stream
});

observable.subscribe({
  next: (value) => console.log('Received:', value),
  complete: () => console.log('Observable completed'),
});

Output:

Received: 1
Received: 2
Received: 3
Observable completed

2. Subject

A Subject is like an Observable, but it’s multicasting—it can emit values to multiple subscribers. Unlike normal Observables, a Subject is hot, meaning it can start emitting values immediately, and any subscriber will get current or future values.

Example:

import { Subject } from 'rxjs';

const subject = new Subject<number>();

subject.subscribe({
  next: (v) => console.log('Subscriber 1:', v)
});

subject.next(1);
subject.next(2);

subject.subscribe({
  next: (v) => console.log('Subscriber 2:', v)
});

subject.next(3);

Output:

Subscriber 1: 1
Subscriber 1: 2
Subscriber 1: 3
Subscriber 2: 3

Notice that Subscriber 2 only gets 3, because the previous values were emitted before it subscribed.


3. BehaviorSubject

If you want new subscribers to get the last emitted value immediately, use BehaviorSubject:

import { BehaviorSubject } from 'rxjs';

const behaviorSubject = new BehaviorSubject<number>(0); // initial value

behaviorSubject.subscribe({
  next: (v) => console.log('Subscriber 1:', v)
});

behaviorSubject.next(1);
behaviorSubject.next(2);

behaviorSubject.subscribe({
  next: (v) => console.log('Subscriber 2:', v)
});

behaviorSubject.next(3);

Output:

Subscriber 1: 0
Subscriber 1: 1
Subscriber 1: 2
Subscriber 2: 2
Subscriber 1: 3
Subscriber 2: 3

Key Points:

  • Observable: Single subscriber, cold by default.
  • Subject: Multicast to multiple subscribers, hot by default.
  • BehaviorSubject: Like Subject but stores latest value for new subscribers.
  • ReplaySubject: Stores multiple previous values for new subscribers.
  • AsyncSubject: Emits last value only when completed.

Leave a Reply