In RxJS, Subject
, BehaviorSubject
, ReplaySubject
, and AsyncSubject
are different types of subjects, which act as both an Observable and an Observer. Here's a breakdown:
πΉ 1. Subject (Basic)
A Subject is a multicast Observable that emits values to multiple subscribers.
β Key Points:
- Does not store the last emitted value.
- New subscribers do not receive past values.
- Emits values only when subscribed.
β Example:
import { Subject } from 'rxjs';
const subject = new Subject();
subject.subscribe(value => console.log('Subscriber 1:', value));
subject.next(1);
subject.next(2);
subject.subscribe(value => console.log('Subscriber 2:', value));
subject.next(3);
π Output:
Subscriber 1: 1
Subscriber 1: 2
Subscriber 1: 3
Subscriber 2: 3
Subscriber 2 only receives 3, not previous values.
πΉ 2. BehaviorSubject (Stores Last Value)
A BehaviorSubject stores the last emitted value and emits it immediately to new subscribers.
β Key Points:
- Requires an initial value.
- New subscribers immediately receive the last emitted value.
- Useful for maintaining state.
β Example:
import { BehaviorSubject } from 'rxjs';
const behaviorSubject = new BehaviorSubject(0); // Initial value is 0
behaviorSubject.subscribe(value => console.log('Subscriber 1:', value));
behaviorSubject.next(1);
behaviorSubject.next(2);
behaviorSubject.subscribe(value => console.log('Subscriber 2:', value));
behaviorSubject.next(3);
π Output:
Subscriber 1: 0
Subscriber 1: 1
Subscriber 1: 2
Subscriber 2: 2 // Gets the last emitted value
Subscriber 1: 3
Subscriber 2: 3
Subscriber 2 receives the last value (2) immediately.
πΉ 3. ReplaySubject (Stores Multiple Past Values)
A ReplaySubject stores a buffer of past values and replays them to new subscribers.
β Key Points:
- Can store multiple past values (configurable).
- New subscribers receive the last X values.
β Example:
import { ReplaySubject } from 'rxjs';
const replaySubject = new ReplaySubject(2); // Stores last 2 values
replaySubject.next(1);
replaySubject.next(2);
replaySubject.next(3);
replaySubject.subscribe(value => console.log('Subscriber 1:', value));
replaySubject.next(4);
π Output:
Subscriber 1: 2 // Gets last 2 values
Subscriber 1: 3
Subscriber 1: 4
Subscriber 1 gets the last 2 values (2,3) immediately.
πΉ 4. AsyncSubject (Emits Only Last Value)
An AsyncSubject emits only the last value and only when the subject completes.
β Key Points:
- Subscribers only get the last value before completion.
- Does not emit intermediate values.
- Useful for one-time events (e.g., API responses).
β Example:
import { AsyncSubject } from 'rxjs';
const asyncSubject = new AsyncSubject();
asyncSubject.subscribe(value => console.log('Subscriber 1:', value));
asyncSubject.next(1);
asyncSubject.next(2);
asyncSubject.next(3);
asyncSubject.complete(); // Emits only the last value
π Output:
Subscriber 1: 3
Only emits
3
aftercomplete()
is called.
π₯ Comparison Table
Feature | Subject | BehaviorSubject | ReplaySubject | AsyncSubject |
---|---|---|---|---|
Stores past values? | β No | β Yes (Last 1) | β Yes (Configurable) | β Yes (Only Last) |
Needs an initial value? | β No | β Yes | β No | β No |
New subscribers get past values? | β No | β Yes (Last 1) | β Yes (Multiple) | β Yes (Only Last, on complete) |
Emits only on complete? | β No | β No | β No | β Yes |
Use case | General event streaming | State management | Replay last X events | One-time final event |
π₯ Which One to Use?
-
Subject
β If you don't need to store previous values. -
BehaviorSubject
β If you need to store the latest value (e.g., user authentication state). -
ReplaySubject
β If you need to store multiple past values (e.g., chat history). -
AsyncSubject
β If you need only the last value after completion (e.g., API request).
Top comments (0)