Sobes.tech
Junior — Middle

Objasnite razliku između Subject i BehaviorSubject u kontekstu reaktivnog programiranja

sobes.tech АИ

Одговор од АИ

U reaktivnom programiranju, posebno u bibliotekama poput RxDart, Subject i BehaviorSubject su specijalne vrste tokova (Streams) koje omogućavaju da budu i izvor podataka (Observable) i slušalac (Observer).

  • Subject je jednostavno tok koji može prihvatiti nove vrednosti i prenositi ih pretplatnicima. Međutim, ako se pretplatnik poveže nakon što su vrednosti već poslata, on neće dobiti te prethodne vrednosti.

  • BehaviorSubject se razlikuje po tome što čuva poslednju poslatu vrednost i odmah je daje novom pretplatniku. Ovo je korisno kada želite da novi pretplatnici odmah dobiju aktuelno stanje.

Primer u Dart-u sa 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('Slušač Subject: $value'));
  behaviorSubject.listen((value) => print('Slušač BehaviorSubject: $value'));

  subject.add(2);
  behaviorSubject.add(2);

  // Izlaz:
  // BehaviorSubject slušač: 1
  // Subject slušač: 2
  // BehaviorSubject slušač: 2
}

Ovde se vidi da BehaviorSubject odmah emituje poslednju vrednost (1) novom slušaču, dok Subject to ne čini.