Sobes.tech
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.