BACK
Уроки39. BehaviorSubject: текущее состояние
Уроки · 39

39. BehaviorSubject: текущее состояние

BehaviorSubject — Subject с памятью текущего

BehaviorSubject — это Subject, который помнит последнее значение. Поэтому:

  • Ему нужно начальное значение при создании.
  • Каждый новый подписчик мгновенно получает текущее значение (snapshot).
  • Можно синхронно получить значение через .getValue().
const user$ = new BehaviorSubject('Guest');
user$.subscribe(v => console.log('A:', v));  // → A: Guest (мгновенно)
user$.next('Admin');                         // → A: Admin
user$.subscribe(v => console.log('B:', v));  // → B: Admin (мгновенно, последнее)
user$.getValue();                             // → 'Admin' (синхронно)

Где использовать

  • Текущий пользователь / тема / язык — состояние, у которого всегда есть значение.
  • Простое хранилище состояния в Angular-сервисе.
  • Любая ситуация, где «опоздавший» подписчик должен сразу узнать текущее.

Современная альтернатива

В новом Angular для локального состояния часто удобнее signal. Но BehaviorSubject всё ещё незаменим, когда состояние должно жить как Observable (например, для пайпа async).

Что нужно сделать

  1. Создайте const user$ = new BehaviorSubject('Guest');
  2. Под первой подпиской вызовите user$.next('Admin');
  3. Лог Current уже использует getValue() — менять не нужно.
Решение spoiler · click to reveal
const { BehaviorSubject } = Rx;

const user$ = new BehaviorSubject('Guest');

user$.subscribe(value => console.log('Sub A: ' + value));

user$.next('Admin');

user$.subscribe(value => console.log('Sub B: ' + value));

console.log('Current: ' + user$.getValue());
script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...