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.