BehaviorSubject est un type de sujet, un sujet est un type spécial d'observable afin que vous puissiez vous abonner à des messages comme tout autre observable. Les caractéristiques uniques de BehaviorSubject sont:
- Il a besoin d'une valeur initiale car il doit toujours retourner une valeur sur abonnement même s'il n'a pas reçu de
next()
- Lors de la souscription, il renvoie la dernière valeur du sujet. Un observable régulier ne se déclenche que lorsqu'il reçoit un
onnext
- à tout moment, vous pouvez récupérer la dernière valeur du sujet dans un code non observable à l'aide de la
getValue()
méthode.
Les caractéristiques uniques d'un sujet par rapport à un observable sont:
- C'est un observateur en plus d'être observable, vous pouvez donc envoyer des valeurs à un sujet en plus de vous y abonner.
De plus, vous pouvez obtenir un sujet observable du comportement en utilisant la asObservable()
méthode on BehaviorSubject
.
Observable est un générique, et BehaviorSubject
est techniquement un sous-type d'Observable parce que BehaviorSubject est un observable avec des qualités spécifiques.
Exemple avec BehaviorSubject :
// Behavior Subject
// a is an initial value. if there is a subscription
// after this, it would get "a" value immediately
let bSubject = new BehaviorSubject("a");
bSubject.next("b");
bSubject.subscribe(value => {
console.log("Subscription got", value); // Subscription got b,
// ^ This would not happen
// for a generic observable
// or generic subject by default
});
bSubject.next("c"); // Subscription got c
bSubject.next("d"); // Subscription got d
Exemple 2 avec sujet régulier:
// Regular Subject
let subject = new Subject();
subject.next("b");
subject.subscribe(value => {
console.log("Subscription got", value); // Subscription wont get
// anything at this point
});
subject.next("c"); // Subscription got c
subject.next("d"); // Subscription got d
Un observable peut être créé à partir des deux Subject
et en BehaviorSubject
utilisant subject.asObservable()
.
La seule différence est que vous ne pouvez pas envoyer de valeurs à une next()
méthode utilisant observable .
Dans les services angulaires, j'utiliserais BehaviorSubject
pour un service de données car un service angulaire s'initialise souvent avant que le composant et le comportement n'assurent que le composant consommant le service reçoive les dernières données mises à jour même s'il n'y a pas de nouvelles mises à jour depuis l'abonnement du composant à ces données.
Shantanu Bhadoria
la source
Observable: résultat différent pour chaque observateur
Une différence très très importante. Comme Observable est juste une fonction, il n'a pas d'état, donc pour chaque nouvel Observer, il exécute le code de création observable encore et encore. Il en résulte:
Cela provoque des bugs majeurs et des inefficacités
BehaviorSubject (ou Subject) stocke les détails de l'observateur, exécute le code une seule fois et donne le résultat à tous les observateurs.
Ex:
JSBin: http://jsbin.com/qowulet/edit?js,console
Production :
Observez comment l'utilisation a
Observable.create
créé une sortie différente pour chaque observateur, mais aBehaviorSubject
donné la même sortie pour tous les observateurs. C'est important.Autres différences résumées.
la source
KnockoutJS's ko.observable()
verra immédiatement plus de parallèles parRx.BehaviorSubject
rapport àRx.Observable
Observable et sujet sont tous deux des moyens observables qu'un observateur peut les suivre. mais les deux ont des caractéristiques uniques. De plus, il y a au total 3 types de sujets, chacun ayant à nouveau des caractéristiques uniques. essayons de comprendre chacun d'eux.
vous pouvez trouver l'exemple pratique ici sur stackblitz . (Vous devez vérifier la console pour voir la sortie réelle)
Observables
Ils sont froids: le code est exécuté quand ils ont au moins un seul observateur.
Crée une copie des données: Observable crée une copie des données pour chaque observateur.
Unidirectionnel: l' observateur ne peut pas attribuer de valeur à observable (origine / maître).
Subject
Ils sont chauds: le code est exécuté et la valeur est diffusée même s'il n'y a pas d'observateur.
Partage des données: les mêmes données sont partagées entre tous les observateurs.
bidirectionnel: l' observateur peut attribuer une valeur à observable (origine / maître).
Si vous utilisez un sujet, vous manquez toutes les valeurs diffusées avant la création de l'observateur. Voici donc Rejouer le sujet
ReplaySubject
Ils sont chauds: le code est exécuté et la valeur est diffusée même s'il n'y a pas d'observateur.
Partage des données: les mêmes données sont partagées entre tous les observateurs.
bidirectionnel: l' observateur peut attribuer une valeur à observable (origine / maître). plus
Relire le flux de messages: peu importe lorsque vous vous abonnez à l'objet de relecture, vous recevrez tous les messages diffusés.
Dans le sujet et le sujet de relecture, vous ne pouvez pas définir la valeur initiale sur observable. Voici donc le sujet comportemental
BehaviorSubject
Ils sont chauds: le code est exécuté et la valeur est diffusée même s'il n'y a pas d'observateur.
Partage des données: les mêmes données sont partagées entre tous les observateurs.
bidirectionnel: l' observateur peut attribuer une valeur à observable (origine / maître). plus
Relire le flux de messages: peu importe lorsque vous vous abonnez à l'objet de relecture, vous recevrez tous les messages diffusés.
Vous pouvez définir la valeur initiale: vous pouvez initialiser l'observable avec la valeur par défaut.
la source
ReplaySubject
a un historique et peut diffuser / émettre une séquence de (anciennes) valeurs. Ce n'est que lorsque le tampon est défini sur 1 qu'il se comporte de la même manière que aBehaviorSubject
.L'objet observable représente une collection basée sur la poussée.
Les interfaces Observer et Observable fournissent un mécanisme généralisé de notification basée sur la poussée, également connu sous le nom de modèle de conception d'observateur. L'objet observable représente l'objet qui envoie des notifications (le fournisseur); l'objet Observer représente la classe qui les reçoit (l'observateur).
La classe Subject hérite à la fois d'Observable et d'Observer, dans le sens où elle est à la fois observateur et observable. Vous pouvez utiliser un sujet pour abonner tous les observateurs, puis abonner le sujet à une source de données principale
Plus d'informations sur https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/subjects.md
la source
Une chose que je ne vois pas dans les exemples est que lorsque vous convertissez BehaviorSubject en Observable via asObservable, il hérite du comportement de retour de la dernière valeur lors de l'abonnement.
C'est le bit délicat, car souvent les bibliothèques exposent les champs comme observables (c'est-à-dire les paramètres dans ActivatedRoute dans Angular2), mais peuvent utiliser Subject ou BehaviorSubject en arrière-plan. Ce qu'ils utilisent affecterait le comportement de l'abonnement.
Voir ici http://jsbin.com/ziquxapubo/edit?html,js,console
la source
Un observable vous permet de vous abonner uniquement alors qu'un sujet vous permet à la fois de publier et de vous abonner.
Un sujet permet donc à vos services d'être utilisés à la fois comme éditeur et comme abonné.
Pour l'instant, je ne suis pas si bon dans
Observable
ce domaine, je ne partagerai donc qu'un exemple deSubject
.Comprenons mieux avec un exemple de CLI angulaire . Exécutez les commandes ci-dessous:
Remplacez le contenu de
app.component.html
par:Exécutez la commande
ng g c components/home
pour générer le composant home. Remplacez le contenu dehome.component.html
par:#message
est la variable locale ici. Ajoutez une propriétémessage: string;
à laapp.component.ts
classe de.Exécutez cette commande
ng g s service/message
. Cela va générer un service àsrc\app\service\message.service.ts
. Fournir ce service à l'application .Importer
Subject
dansMessageService
. Ajoutez également un sujet. Le code final doit ressembler à ceci:Maintenant, injectez ce service
home.component.ts
et passez-en une instance au constructeur. Faites celaapp.component.ts
aussi. Utilisez cette instance de service pour transmettre la valeur de#message
à la fonction de servicesetMessage
:À l'intérieur
app.component.ts
, abonnez-vous et désabonnez-vous (pour éviter les fuites de mémoire) àSubject
:C'est ça.
Maintenant, toute valeur entrée à l'intérieur
#message
dehome.component.html
doit être imprimée à l'{{message}}
intérieurapp.component.html
la source
app.component.ts
behavior.service.ts
custom.component.ts
la source
BehaviorSubject vs Observable : RxJS a des observateurs et des observables, Rxjs propose plusieurs classes à utiliser avec les flux de données, et l'une d'entre elles est BehaviorSubject.
Observables : les observables sont des collections paresseuses de plusieurs valeurs au fil du temps.
BehaviorSubject : un sujet qui requiert une valeur initiale et émet sa valeur actuelle aux nouveaux abonnés.
la source
Considérez Observables comme un tuyau avec de l'eau qui coule, parfois l'eau coule et parfois non. Dans certains cas, vous pouvez avoir besoin d'un tuyau qui contient toujours de l'eau, vous pouvez le faire en créant un tuyau spécial qui contient toujours de l'eau, peu importe sa taille, appelons ce tuyau spécial BehaviorSubject , si vous vous trouvez être un fournisseur d'eau dans votre communauté, vous pouvez dormir paisiblement la nuit en sachant que votre nouveau tuyau fonctionne.
En termes techniques: vous pouvez rencontrer des cas d'utilisation où un observable doit toujours avoir de la valeur, peut-être que vous voulez capturer la valeur d'un texte d'entrée au fil du temps, vous pouvez ensuite créer une instance de BehaviorSubject pour garantir ce type de comportement, disons:
Vous pouvez ensuite utiliser "value" pour échantillonner les changements au fil du temps.
Cela est pratique lorsque vous combinez Observables plus tard, en examinant le type de votre flux en tant que BehaviorSubject, vous pouvez ensuite vous assurer que le flux se déclenche au moins ou émet un signal au moins une fois .
la source