BehaviorSubject vs Observable : quelle différence ?
Les classes "Subject" et "BehaviorSubject" sont des objets qui sont à la fois des observateurs et des observables. Leur différence principale se situe lors de l'initialisation.
La programmation réactive est un des principes fondamentaux utilisés par le framework Angular. Le principe consiste à utiliser deux types d'objets, les observateurs et les observables. Les premiers observent les derniers et réagissent lorsque la valeur des observables a été modifiée. Cela permet d'avoir une réactivité importante pour une application et plus spécifiquement sur les interfaces graphiques. La classe "BehaviorSubject" est en fait un sous-type de la classe "Subject", qui est un observable. Elle possède donc des spécificités particulières.
Pour un objet de la classe "Observable", un observateur ne récupère que les nouvelles valeurs définies après la souscription
Les classes "Subject" et "BehaviorSubject" sont des objets qui sont à la fois des observateurs et des observables. Leur différence principale se situe lors de l'initialisation. Pour un objet de la classe "Observable", un observateur ne récupère que les nouvelles valeurs définies après la souscription. Les anciennes valeurs ne peuvent être récupérées.
let monObjet = new Subject(); monObjet.next("valeurAvantSouscription"); monObjet.subscribe(valeur => { console.log("La valeur de mon objet est ", valeur); //Valeur ne correspond à rien car seules les valeurs après la souscription comptent }); monObjet.next("valeurApresSouscription"); //Valeur vaut alors "valeurApreSouscription"
Un objet de classe "BehaviorSubject" doit lui être initialisé avec une valeur par défaut, car la principale caractéristique est de toujours devoir retourner une valeur aux observateurs. Lors de la souscription, l'objet retourne la dernière valeur qu'il possède. Elle notifie ensuite les observateurs de la même manière qu'un observable.
let monAutreObjet = new BehaviorSubject("maPremiereValeur"); monAutreObjet.next("valeurAvantSouscription"); monAutreObjet.subscribe(valeur => { console.log("La valeur de mon autre objet est ", valeur); //Valeur vaut au moment de la souscription la valeur "valeurAvantSouscription" }); monAutreObjet.next("valeurApresSouscription"); //Valeur vaut alors "valeurApresSouscription"
De plus, il est possible d'obtenir la valeur d'un objet de la classe "BehaviorSubject" à partir de n'importe quel emplacement de code non observable grâce à la méthode "getValue()".
C'est à vous de choisir quelle classe utiliser selon le développement que vous faites. Il est possible de créer des objets observables seulement à partir des deux classes "Subject" et "BehaviorSubject" grâce à la méthode "asObservable()". Les objets créés avec cette méthode ne peuvent pas utiliser la méthode "next()" pour changer la valeur mais permettent ainsi de cacher l'identité de l'objet qui les a créés.