Subjects let you send and receive messages in Angular. Different types help you control how messages are shared and remembered.
Subject types (Subject, BehaviorSubject, ReplaySubject) in Angular
import { Subject, BehaviorSubject, ReplaySubject } from 'rxjs'; const subject = new Subject<Type>(); const behaviorSubject = new BehaviorSubject<Type>(initialValue); const replaySubject = new ReplaySubject<Type>(bufferSize);
Subject sends messages only to current listeners.
BehaviorSubject needs an initial value and remembers the last message.
const subject = new Subject<number>(); subject.next(1); subject.subscribe(value => console.log('Subject:', value)); subject.next(2);
const behaviorSubject = new BehaviorSubject<number>(0); behaviorSubject.next(1); behaviorSubject.subscribe(value => console.log('BehaviorSubject:', value)); behaviorSubject.next(2);
const replaySubject = new ReplaySubject<number>(2); replaySubject.next(1); replaySubject.next(2); replaySubject.next(3); replaySubject.subscribe(value => console.log('ReplaySubject:', value)); replaySubject.next(4);
This Angular component shows how each subject type behaves when you subscribe and send messages. Buttons let you subscribe to each subject and see console logs.
import { Component } from '@angular/core'; import { Subject, BehaviorSubject, ReplaySubject } from 'rxjs'; @Component({ selector: 'app-subject-demo', template: ` <h2>Subject Types Demo</h2> <button (click)="subscribeToSubject()">Subscribe to Subject</button> <button (click)="subscribeToBehaviorSubject()">Subscribe to BehaviorSubject</button> <button (click)="subscribeToReplaySubject()">Subscribe to ReplaySubject</button> ` }) export class SubjectDemoComponent { subject = new Subject<string>(); behaviorSubject = new BehaviorSubject<string>('Initial'); replaySubject = new ReplaySubject<string>(2); constructor() { this.subject.next('Message 1'); this.behaviorSubject.next('Message 1'); this.replaySubject.next('Message 1'); this.replaySubject.next('Message 2'); } subscribeToSubject() { this.subject.subscribe(value => console.log('Subject:', value)); this.subject.next('Message 2'); } subscribeToBehaviorSubject() { this.behaviorSubject.subscribe(value => console.log('BehaviorSubject:', value)); this.behaviorSubject.next('Message 2'); } subscribeToReplaySubject() { this.replaySubject.subscribe(value => console.log('ReplaySubject:', value)); this.replaySubject.next('Message 3'); } }
Subjects are both observers and observables, so you can send and listen to messages.
BehaviorSubject always needs an initial value.
ReplaySubject keeps a buffer of past messages to replay to new subscribers.
Subject sends messages only to current subscribers.
BehaviorSubject remembers the last message and sends it immediately to new subscribers.
ReplaySubject replays a set number of past messages to new subscribers.
Practice
Solution
Step 1: Understand BehaviorSubject behavior
BehaviorSubject stores the last emitted value and sends it immediately to any new subscriber.Step 2: Compare with other Subjects
Subject sends only to current subscribers without remembering past values. ReplaySubject replays multiple past values, not just the last one.Final Answer:
BehaviorSubject -> Option BQuick Check:
Last value sent immediately = BehaviorSubject [OK]
- Confusing ReplaySubject with BehaviorSubject
- Thinking Subject remembers past values
- Assuming AsyncSubject behaves like BehaviorSubject
Solution
Step 1: Check ReplaySubject constructor
ReplaySubject takes a number argument specifying how many past values to store and replay.Step 2: Validate options
new ReplaySubject(3) correctly passes number 3. new ReplaySubject() uses no argument (defaults to unlimited or 1 depending on implementation). new ReplaySubject(1) stores only 1 value. new ReplaySubject('3') passes a string, which is invalid.Final Answer:
new ReplaySubject(3) -> Option CQuick Check:
ReplaySubject(3) stores last 3 values [OK]
- Passing string instead of number to ReplaySubject
- Omitting the buffer size argument
- Confusing ReplaySubject with BehaviorSubject constructor
const subject = new BehaviorSubject('start');
subject.next('first');
subject.subscribe(value => console.log('Subscriber 1:', value));
subject.next('second');
subject.subscribe(value => console.log('Subscriber 2:', value));What will be printed to the console?
Solution
Step 1: Trace BehaviorSubject emissions
BehaviorSubject starts with 'start', then next emits 'first'. Subscriber 1 subscribes after 'first', so it receives the last value 'first' immediately, then 'second' when emitted.Step 2: Analyze Subscriber 2 subscription
Subscriber 2 subscribes after 'second' is emitted, so it immediately receives 'second'.Final Answer:
Subscriber 1: start
Subscriber 1: first
Subscriber 1: second
Subscriber 2: second -> Option AQuick Check:
BehaviorSubject sends last value on subscribe [OK]
- Assuming Subscriber 2 gets 'first' value
- Ignoring initial 'start' emission to Subscriber 1
- Ignoring immediate emission on subscription
const subject = new Subject();
subject.next('hello');
subject.subscribe(value => console.log(value));Solution
Step 1: Understand Subject behavior
Subject sends values only to current subscribers. Since next('hello') is called before subscribe, no subscriber receives it.Step 2: Check for errors
There is no syntax or runtime error. The code runs but subscriber misses the first value.Final Answer:
The subscription will not receive 'hello' because Subject does not replay past values. -> Option AQuick Check:
Subject sends only to current subscribers [OK]
- Expecting subscriber to get values emitted before subscription
- Thinking next() before subscribe causes error
- Confusing Subject with BehaviorSubject or ReplaySubject
Solution
Step 1: Identify requirement for storing multiple past messages
BehaviorSubject stores only the last single value, so it cannot replay two messages automatically.Step 2: Choose Subject type that replays multiple past values
ReplaySubject with buffer size 2 stores and replays last 2 messages automatically to new subscribers.Step 3: Evaluate other options
Subject does not store past messages. ReplaySubject(1) stores only one message, not two.Final Answer:
Use ReplaySubject(2) to store and replay last 2 messages to new subscribers. -> Option DQuick Check:
ReplaySubject(n) replays last n messages [OK]
- Using BehaviorSubject to store multiple past messages
- Assuming Subject stores past messages
- Setting ReplaySubject buffer size too low
Ready to prove it?
Pass the test and this pattern moves unknown
