Retour au cours

BehaviorSubject et ReplaySubject

Le Développeur Angular Complet : de Zéro à Héros

59. BehaviorSubject et ReplaySubject

Ces Subjects spécialisés sont essentiels pour la gestion d'état dans les services car ils permettent aux nouveaux abonnés de recevoir instantanément une valeur précédente.

1. BehaviorSubject<T> (État actuel)

Un BehaviorSubject nécessite une valeur initiale à la création. Lorsqu'un nouvel abonné arrive, il reçoit immédiatement la dernière valeur émise avant de recevoir les futures émissions.

Cas d'usage : Suivi du statut de l'utilisateur, contenu du panier d'achat ou configuration de l'application (où chaque abonné a besoin de connaître l'état actuel immédiatement).

typescript import { BehaviorSubject } from 'rxjs';

const theme$ = new BehaviorSubject('light');

// L'abonné A reçoit 'light' immédiatement theme$.subscribe(theme => console.log('A:', theme));

theme$.next('dark'); // Tous les abonnés reçoivent 'dark'

// L'abonné B s'abonne plus tard theme$.subscribe(theme => console.log('B:', theme)); // B reçoit immédiatement 'dark'

theme$.next('system'); /* Séquence de sortie : A: light, A: dark, B: dark, A: system, B: system */

// Nous pouvons lire la valeur actuelle de manière synchrone sans s'abonner console.log(theme$.value); // 'system'

2. ReplaySubject<T> (Historique)

Un ReplaySubject enregistre un nombre spécifié de valeurs émises et les rejoue pour tout nouvel abonné.

Cas d'usage : Journalisation d'erreurs (si un utilisateur clique sur un bouton, vous pourriez vouloir voir les 5 derniers logs survenus juste avant le clic).

typescript import { ReplaySubject } from 'rxjs';

// Rejouer les 2 dernières valeurs const notification$ = new ReplaySubject(2);

notification$.next('A'); notification$.next('B'); notification$.next('C'); // 'A' est supprimé de l'historique

// Le nouvel abonné D arrive notification$.subscribe(msg => console.log('D a reçu :', msg)); // Sortie : D a reçu : B, D a reçu : C