Junior — Middle
Vysvětlete rozdíl mezi Subject a BehaviorSubject v kontextu reaktivního programování
sobes.tech AI
Odpověď od AI
V reaktivním programování, zejména v knihovnách jako RxDart, jsou Subject a BehaviorSubject speciální typy toků (Streams), které umožňují být současně zdrojem dat (Observable) i posluchačem (Observer).
-
Subject je prostě tok, který může přijímat nové hodnoty a předávat je odběratelům. Pokud se však k němu připojí odběratel po odeslání hodnot, tyto předchozí hodnoty nezíská.
-
BehaviorSubject se liší tím, že uchovává poslední odeslanou hodnotu a ihned ji předává novému odběrateli. To je užitečné, když chcete, aby noví odběratelé ihned obdrželi aktuální stav.
Příklad v Dart s RxDart:
import 'package:rxdart/rxdart.dart';
void main() {
final subject = PublishSubject<int>(); // PublishSubject je ekvivalent Subject
final behaviorSubject = BehaviorSubject<int>();
subject.add(1);
behaviorSubject.add(1);
subject.listen((value) => print('Posluchač Subject: $value'));
behaviorSubject.listen((value) => print('Posluchač BehaviorSubject: $value'));
subject.add(2);
behaviorSubject.add(2);
// Výstup:
// BehaviorSubject posluchač: 1
// Subject posluchač: 2
// BehaviorSubject posluchač: 2
}
Zde je vidět, že BehaviorSubject ihned vydává poslední hodnotu (1) novému posluchači, zatímco Subject nikoliv.