Subject is both an Observable and an Observer. BehaviorSubject stores its current value and immediately hands it to new subscribers.
typescript
import { Subject, BehaviorSubject } from 'rxjs';
// Subject - simple event bus
const subject = new Subject<string>();
subject.subscribe(val => console.log('Subscriber 1:', val));
subject.next('Hello'); // Subscriber 1: Hello
subject.subscribe(val => console.log('Subscriber 2:', val));
subject.next('World'); // Both subscribers receive 'World'
// BehaviorSubject - has initial value, remembers last value
const behaviorSubject = new BehaviorSubject<number>(0);
behaviorSubject.subscribe(val => console.log('Sub A:', val)); // Sub A: 0
behaviorSubject.next(1); // Sub A: 1
// New subscriber gets last value immediately
behaviorSubject.subscribe(val => console.log('Sub B:', val)); // Sub B: 1
// Real example: Shared state service
@Injectable({ providedIn: 'root' })
export class UserStateService {
private userSubject = new BehaviorSubject<User | null>(null);
user$ = this.userSubject.asObservable();
setUser(user: User) {
this.userSubject.next(user);
}
}You should see
(Subject/BehaviorSubject can be used to share data between components)