Behavior Subject - это тип Subject, который, в свою очередь, является особым типом Observable, на который мы можем подписаться, чтобы получить последнее значение. Его нужно инициализировать. Даже если он не был выполнен с помощью метода next (), он все равно может вернуть последнее значение, которое является инициализированным значением.

Давайте посмотрим на BehaviorSubject в действии с помощью очень простого фрагмента кода.

import { BehaviorSubject } from 'rxjs' ;
const bs$ = new BehaviorSubject( 1 );
bs$.subscribe((value) => {
console.log(value);
});
bs$.next( 2 );

Здесь мы создали новый объект BehaviorSubject через константу bs $. Мы инициализировали его значением 1. Затем мы подписываемся на BehaviorSubject, чтобы распечатать текущее значение. В следующем операторе мы устанавливаем значение BehaviorSubject равным 2. Если мы посмотрим на инструмент разработчика в браузере, мы получим следующий результат.

// 1
// 2
  • BehaviorSubject является не только наблюдателем, но и наблюдаемым. Мы можем отправить ему значение помимо подписки.
  • Мы можем получить наблюдаемое из BehaviorSubject, используя метод asObservable () для BehaviorSubject.
  • Наблюдаемое может испускать значения, когда метод next () выполняется хотя бы один раз. Но для BehaviorSubject нам не нужно вызывать метод next (). Он вернет хотя бы одно значение.
  • Observables возвращают разные значения разным наблюдателям, тогда как BehaviorSubject возвращает одно и то же значение, то есть последнее значение для всех наблюдателей.

Этот факт можно продемонстрировать с помощью следующего фрагмента кода.

const randomNumber1 = new Observable((observer) => { // (1)
observer.next(Math.random());
});
randomNumber1
.subscribe(num => console.log( 'observer 1: ' + num)); // (2)
randomNumber1
.subscribe(num => console.log( 'observer 2: ' + num)); // (3)
const randomNumber2 = new BehaviorSubject( 0 ); // (4)
randomNumber2.next(Math.random());
randomNumber2
.subscribe(num => console.log( 'observer behaviorsubject 1: ' +
num));
randomNumber2
.subscribe(num => console.log( 'observer behaviorsubject 2: ' +
num));
}

В приведенных выше фрагментах кода на шаге 1 мы создали Observable и установили значение next () из случайного числа, сгенерированного объектом Math. На следующих шагах 2 и 3 мы подписываемся на наблюдаемое. Затем на шаге 4 мы создаем BehaviorSubject с начальным значением 0. На следующих последующих шагах мы подписываемся на BehaviorSubject.

Когда мы запустим приведенный выше код, мы получим следующий вывод, напечатанный на консоли.

// observer 1: 0.08208077981971873
// observer 2: 0.2697879588072649
// observer behavior subject 1: 0.46334149248702117
// observer behavior subject 2: 0.46334149248702117

Мы можем видеть, что наблюдаемый возвращает разные значения, но подписчики на BehaviorSubject возвращают то же значение, то есть последнее значение, испущенное BehaviorSubject.

Некоторые из основных выводов, связанных с BehaviorSubject, перечислены ниже.

  • Observable не имеет состояния, это просто функция, а у BehaviorSubject есть состояние.
  • Различные экземпляры кода запускаются для разных наблюдателей, для BehaviorSubject один и тот же экземпляр запускается для всех.
  • Наблюдаемые холодные, т.е. код выполняется, когда у них есть хотя бы один наблюдатель.
  • BehaviorSubject является горячим, т.е. код выполняется и выдает значение, даже если нет наблюдателя.
  • Observable работает по шаблону PUSH, тогда как BehaviorSubject работает как с push, так и с pull, поскольку BehaviorSubject может быть как наблюдателем, так и наблюдаемым.

Это некоторые из основных моментов, связанных с BehaviorSubject.