DEV Community

Neelendra Tomar
Neelendra Tomar

Posted on

RxJS Subjects Explained: Subject vs BehaviorSubject vs ReplaySubject vs AsyncSubject πŸš€

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);
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Output:

Subscriber 1: 1
Subscriber 1: 2
Subscriber 1: 3
Subscriber 2: 3
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Output:

Subscriber 1: 0
Subscriber 1: 1
Subscriber 1: 2
Subscriber 2: 2  // Gets the last emitted value
Subscriber 1: 3
Subscriber 2: 3
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Output:

Subscriber 1: 2  // Gets last 2 values
Subscriber 1: 3
Subscriber 1: 4
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

πŸ“Œ Output:

Subscriber 1: 3
Enter fullscreen mode Exit fullscreen mode

Only emits 3 after complete() 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?

  1. Subject β†’ If you don't need to store previous values.
  2. BehaviorSubject β†’ If you need to store the latest value (e.g., user authentication state).
  3. ReplaySubject β†’ If you need to store multiple past values (e.g., chat history).
  4. AsyncSubject β†’ If you need only the last value after completion (e.g., API request).

Top comments (0)