Що таке BehaviorSubject?
Коротко (як на співбесіді)
BehaviorSubject - це спеціальний тип Subject в RxJS, який зберігає останнє значення і одразу віддає його новим підписникам.
На відміну від звичайного Subject, він вимагає початкове значення.
Часто використовується в Angular для простого state-management і передачі даних між компонентами.
Розгорнуто
BehaviorSubject - це одночасно:
- Observable (на нього можна підписуватися)
- Observer (в нього можна надсилати значення через
next())
Головна відмінність від Subject: наявність поточного значення (current value).
Приклад:
ts
import { BehaviorSubject } from 'rxjs';
const subject = new BehaviorSubject<number>(0);
subject.subscribe(v => console.log('A:', v));
subject.next(1);
subject.next(2);
subject.subscribe(v => console.log('B:', v));Вивід:
A: 0
A: 1
A: 2
B: 2Другий підписник одразу отримав останнє значення (2).
В Angular використовується для
Дуже часто, для зберігання стану в сервісі:
ts
@Injectable()
export class UserService {
private userSubject = new BehaviorSubject<User | null>(null);
user$ = this.userSubject.asObservable();
setUser(user: User) {
this.userSubject.next(user);
}
}Компонент:
ts
this.userService.user$.subscribe(user => {
console.log(user);
});Відмінність від Subject
| Тип | Зберігає значення | Початкове значення | Новий підписник отримує останнє |
|---|---|---|---|
| Subject | Ні | Ні | Ні |
| BehaviorSubject | Так | Так | Так |
Коли використовують BehaviorSubject
Зазвичай, коли потрібен:
- поточний state
- глобальний стан
- shared data
- reactive store light-версія
Наприклад:
- поточний користувач
- тема застосунку
- стан завантаження
- фільтри
Типове follow-up питання на співбесіді
Зазвичай запитують:
BehaviorSubject vs ReplaySubject?
Коротко:
- BehaviorSubject → зберігає 1 останнє значення
- ReplaySubject → зберігає N значень
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.