Dans les services angulaires, il est courant d'utiliser des sujets et des observables RxJS pour gérer l'état. Cependant, ces constructions ne permettent pas naturellement de récupérer leur valeur actuelle en dehors de l’abonnement. Cet article explique comment accéder à la valeur actuelle dans de tels scénarios.
Considérez le service Angular suivant qui utilise un sujet pour gérer une propriété booléenne isLoggedIn :
<code class="typescript">import {Subject} from 'rxjs/Subject'; import {Injectable} from 'angular2/core'; @Injectable() export class SessionStorage { private _isLoggedInSource = new Subject<boolean>(); isLoggedIn = this._isLoggedInSource.asObservable(); ... }</code>
Dans certains cas, vous pouvez Vous devez accéder à la valeur actuelle de isLoggedIn sans vous y abonner. Cela n'est pas possible avec un sujet normal, car il émet uniquement des valeurs à ses abonnés et ne stocke pas son état actuel.
Solution : utiliser BehaviourSubject
Pour surmonter ce problème limitation, envisagez de passer à BehaviorSubject, un type RxJS spécialisé qui maintient un tampon interne pour stocker la dernière valeur émise.
<code class="typescript">import {BehaviorSubject} from 'rxjs/BehaviorSubject'; @Injectable() export class SessionStorage { private _isLoggedInSource = new BehaviorSubject<boolean>(false); isLoggedIn = this._isLoggedInSource.asObservable(); ... }</code>
Par rapport au sujet, BehaviorSubject présente deux avantages principaux :
Exemple avec BehaviorSubject :
En utilisant BehaviorSubject, vous pouvez accéder à la valeur actuelle de isLoggedIn même sans vous abonner :
<code class="typescript">const sessionStorage = new SessionStorage(); const isLoggedInCurrentValue = sessionStorage._isLoggedInSource.getValue(); console.log(isLoggedInCurrentValue); // True or False</code>
En résumé, si vous avez besoin d'accéder à la valeur actuelle de un sujet RxJS ou observable, envisagez de passer à BehaviorSubject, qui fournit à la fois une émission immédiate pour les nouveaux abonnés et une méthode getValue() pour une récupération directe.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!