J'ai cherché à comprendre ces 3:
Sujet , sujet du comportement et sujet de la relecture . Je voudrais les utiliser et savoir quand et pourquoi, quels sont les avantages de les utiliser et bien que j'aie lu la documentation, regardé des didacticiels et cherché sur Google, je n'ai pas réussi à comprendre cela.
Alors, quel est leur but? Un cas réel serait très apprécié car il n'a même pas besoin de coder.
Je préférerais une explication claire et pas seulement "a + b => c vous êtes abonné ...."
Je vous remercie
javascript
angular
rxjs
reactive-programming
angular2-observables
Paul Samsotha
la source
la source
Réponses:
Cela se résume vraiment au comportement et à la sémantique. Avec un
Subject
- un abonné ne recevra que les valeurs publiées qui ont été émises après l'abonnement. Demandez-vous, c'est ce que vous voulez? L'abonné a-t-il besoin de connaître les valeurs précédentes? Sinon, vous pouvez l'utiliser, sinon choisissez l'un des autres. Par exemple, avec la communication composant à composant. Supposons que vous ayez un composant qui publie des événements pour d'autres composants en un clic. Vous pouvez utiliser un service avec un sujet pour communiquer.BehaviorSubject
- la dernière valeur est mise en cache. Un abonné recevra la dernière valeur lors de l'abonnement initial. La sémantique de ce sujet est de représenter une valeur qui change avec le temps. Par exemple, un utilisateur connecté. L'utilisateur initial peut être un utilisateur anonyme. Mais une fois qu'un utilisateur se connecte, la nouvelle valeur est l'état de l'utilisateur authentifié.Le
BehaviorSubject
est initialisé avec une valeur initiale. Ceci est parfois important pour la préférence de codage. Disons par exemple que vous l'initialisez avec unnull
. Ensuite, dans votre abonnement, vous devez faire une vérification nulle. Peut-être OK, ou peut-être ennuyeux.ReplaySubject
- il peut mettre en cache jusqu'à un nombre spécifié d'émissions. Tous les abonnés recevront toutes les valeurs mises en cache lors de l'abonnement. Quand auriez-vous besoin de ce comportement? Honnêtement, je n'ai pas eu besoin d'un tel comportement, sauf dans le cas suivant:Si vous initialisez a
ReplaySubject
avec une taille de tampon de1
, alors il se comporte exactement comme aBehaviorSubject
. La dernière valeur est toujours mise en cache, elle agit donc comme une valeur changeant au fil du temps. Avec cela, il n'y a pas besoin denull
vérification comme dans le cas de l'BehaviorSubject
initialisé avec unnull
. Dans ce cas, aucune valeur n'est jamais émise à l'abonné jusqu'à la première publication.Donc, cela dépend vraiment du comportement que vous attendez (comme pour lequel utiliser). La plupart du temps, vous voudrez probablement utiliser a
BehaviorSubject
parce que ce que vous voulez vraiment représenter, c'est cette sémantique «valeur dans le temps». Mais personnellement, je ne vois rien de mal à remplacerReplaySubject
initialisé par1
.Ce que vous voulez éviter, c'est d'utiliser la vanille
Subject
lorsque vous avez vraiment besoin d'un comportement de mise en cache. Prenez, par exemple, vous écrivez une garde de routage ou une résolution. Vous récupérez des données dans cette garde et les définissez dans un serviceSubject
. Ensuite, dans le composant acheminé, vous vous abonnez au service sujet pour essayer d'obtenir cette valeur qui a été émise dans la garde. Oups. Où est la valeur? C'était déjà émis, DUH. Utilisez un sujet de "mise en cache"!Voir également:
la source
ReplaySubject
avec une taille de tampon de 1 était exactement ce dont j'avais besoin. J'avais un garde-route qui avait besoin de la valeur, mais il fallait attendre la première émission. Donc, unBehaviorSubject
ne le coupait pas, car je ne voulais pas de valeur initiale (null
ne fonctionnerait pas non plus parce que je l'utilisais pour signifier un état)resolve
classe de garde angulaire . Mon service de données peut être asynchrone ou synchrone (si les données ont déjà été récupérées). S'il était synchrone, le Subject.next () était déclenché avant que laresolve
fonction ne soit retournée et ne soit abonnée par Angular en interne. BehaviourSubject fonctionnerait peut-être, mais je devrais appeler explicitementcomplete()
et ajouter également desnull
vérifications pour la valeur initiale. Ce qui a fonctionné était nouveauReplaySubject<DataType>(1)
etresolveSubject.asObservable().take(1).map(....)
.asObservable()
l'Observable, j'envoie une valeur denull
aux abonnés avant d'appelernext()
mon ReplaySubject. Je pensais qu'il n'était pas censé avoir une valeur initiale contrairement à BehaviorSubject?Un résumé pratique des différents types observables, une dénomination non intuitive je sais lol .
Subject
- Un abonné ne recevra les valeurs publiées qu'après la souscription.BehaviorSubject
- Les nouveaux abonnés obtiennent la dernière valeur publiée OU la valeur initiale dès la souscription.ReplaySubject
- Les nouveaux abonnés obtiennent toutes les valeurs précédemment publiées dès leur souscriptionla source
Avec cet exemple, voici le résultat qui sera imprimé dans la console:
Voici un exemple d'utilisation pour les sujets de relecture où un
buffer of 2 previous values
est conservé et émis sur les nouveaux abonnements:Voici ce que cela nous donne sur la console:
Et le résultat:
Référence: https://alligator.io/rxjs/subjects/
la source
De: Randall Koutnik livre «Créer des sites Web réactifs avec RxJS». :
Un sujet est un objet qui est un observable turbocompressé. À la base, un sujet agit un peu comme un observable régulier, mais chaque abonnement est relié à la même source. Les sujets sont également des observateurs et disposent de méthodes suivantes, erreurs et terminées pour envoyer des données à tous les abonnés à la fois. Parce que les sujets sont des observateurs, ils peuvent être transmis directement à un appel d'abonnement, et tous les événements de l'observable d'origine seront envoyés via le sujet à ses abonnés.
Nous pouvons utiliser le ReplaySubject pour suivre l'historique. UNE ReplaySubject enregistre les n derniers événements et les renvoie à chaque nouvel abonné. Par exemple dans l'application de chat. Nous pouvons l'utiliser pour suivre l'historique des discussions précédentes.
Un BehaviorSubject est une version simplifiée de ReplaySubject . Le ReplaySubject a stocké un nombre arbitraire d'événements, le BehaviorSubject n'enregistre que la valeur du dernier événement. Chaque fois qu'un BehaviorSubject enregistre un nouvel abonnement, il émet la dernière valeur à l'abonné ainsi que toutes les nouvelles valeurs transmises. Le BehaviorSubject est utile lorsqu'il s'agit d'unités d'état uniques, telles que les options de configuration.
la source
La réponse la plus votée est manifestement erronée en affirmant que:
"Si vous initialisez a
ReplaySubject
avec une taille de tampon de 1, il se comporte en fait comme unBehaviorSubject
"Ce n'est pas totalement vrai; Consultez cet excellent article de blog sur les différences entre ces deux éléments. Par exemple, si vous vous abonnez à un terminé
BehaviorSubject
, vous ne recevrez pas la dernière valeur mais pour unReplaySubject(1)
vous recevrez la dernière valeur.C'est une différence importante à ne pas négliger:
Consultez cet exemple de code ici qui provient d' un autre excellent article de blog sur le sujet.
la source
la source