Na stronie Programowanie → Angular - podstawy → Angular - typ Observable opisywałem interesujące zagadnienia związane z typem Observable. Nadeszła jednak doniosła chwila, aby zająć się typem BehaviorSubject, który rozszerza funkcjonalność typu Observable o pewne nowe zachowania dające nowe możliwości. Do różnic pomiędzy tymi dwoma typami obiektów należy wymienić:
w przypadku Observable dane można otrzymać jedynie poprzez subskrybcję, w przypadku BehaviorSubject zapamiętywany jest ostatni wprowadzony stan, do którego można się odwołać za pomocą gettera value lub otrzymać tę wartość poprzez subskrypcję;
BehaviorSubject wymaga zainicjowania wartością początkową
Tak więc, niezależnie kiedy i o jakiej porze dnia czy nocy zasubskrybujesz się do BahaviorSubject-a zawsze ale to zawsze będziesz otrzymywać ostatnią wartość doń przypisaną. Oto prosty przykład, który mówi więcej niż milion słów:
let behaviorSubject: BehaviorSubject<string> = new BehaviorSubject<string>('Some start value');
let firstSubscibent = behaviorSubject.subscribe(
value => console.log('First subscribe value', value)
);
console.log('Start value of BehaviorSubject', behaviorSubject.value);
behaviorSubject.next('Next value');
behaviorSubject.next('Another one');
let nextSubscibent = behaviorSubject.subscribe(
value => console.log('Second subscribe value:', value)
);
console.log('End value of BehaviorSubject', behaviorSubject.value);
A oto i co wypluwa konsola przeglądarki:
First subscribe value Some start value
Start value of BehaviorSubject Some start value
First subscribe value Next value
First subscribe value Another one
Second subscribe value: Another one
End value of BehaviorSubject Another one
Ważne aby pamiętać o odsubskrybowaniu się w destruktorze. Bez tego będzie dochodziło do wycieków pamięci.