254 votes

Sujet vs ComportementSujet vs ReplaySujet en Angular

J'ai cherché à comprendre ces trois-là :

Sujet , Sujet de comportement y Sujet de la relecture . J'aimerais les utiliser et savoir quand et pourquoi, quels sont les avantages de leur utilisation et bien que j'aie lu la documentation, regardé des tutoriels et cherché sur Google, je n'ai pas réussi à y voir clair.

Quels sont donc leurs objectifs ? Un cas concret serait le plus apprécié ; il ne doit même pas être codé.

Je préférerais une explication claire, pas seulement "a+b => c vous êtes abonné à ....".

Merci.

494voto

peeskillet Points 32287

C'est une question de comportement et de sémantique. Avec un

  • Subject - un abonné ne recevra que les valeurs publiées qui ont été émises après l'abonnement. Demandez-vous si c'est ce que vous voulez. L'abonné a-t-il besoin de savoir quoi que ce soit sur les valeurs précédentes ? Si ce n'est pas le cas, vous pouvez l'utiliser, sinon choisissez l'une des autres solutions. Par exemple, avec la communication entre composants. Disons que vous avez un composant qui publie des événements pour d'autres composants lors d'un clic sur un bouton. Vous pouvez utiliser un service avec un sujet pour communiquer.

  • BehaviorSubject - la dernière valeur est mise en cache. Un abonné obtiendra la dernière valeur lors de son inscription initiale. La sémantique de ce sujet est de représenter une valeur qui change dans le temps. Par exemple, un utilisateur connecté. L'utilisateur initial peut être un utilisateur anonyme. Mais dès qu'un utilisateur se connecte, la nouvelle valeur est l'état d'utilisateur authentifié.

    El BehaviorSubject est initialisé avec une valeur initiale. Ceci est parfois important pour les préférences de codage. Disons par exemple que vous l'initialisez avec une valeur null . Ensuite, dans votre abonnement, vous devez effectuer un contrôle de nullité. C'est peut-être bon, ou peut-être ennuyeux.

  • ReplaySubject - il peut mettre en cache jusqu'à un nombre spécifié d'émissions. Tous les abonnés obtiendront toutes les valeurs mises en cache lors de leur inscription. 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 un ReplaySubject avec une taille de tampon de 1 alors, en fait, c'est se comporte comme suit : comme un BehaviorSubject . La dernière valeur est toujours mise en cache, de sorte qu'elle agit comme une valeur qui change au fil du temps. Avec cela, il n'est pas nécessaire d'avoir un null contrôle comme dans le cas de la BehaviorSubject initialisé avec un null car aucune valeur n'est jamais émise vers l'abonné avant la première publication.

Il s'agit donc de déterminer le comportement que vous attendez, pour savoir lequel utiliser. La plupart du temps, vous voudrez probablement utiliser une fonction BehaviorSubject car ce que vous voulez vraiment représenter, c'est la sémantique de la "valeur dans le temps". Mais personnellement, je ne vois rien de mal à ce que la substitution de ReplaySubject initialisé avec 1 .

Ce que vous voulez éviter utilise la vanille Subject alors que ce dont vous avez réellement besoin, c'est d'un comportement de mise en cache. Prenons l'exemple d'une garde de routage ou d'une résolution. Vous récupérez des données dans cette garde et les placez dans un service Subject . Ensuite, dans le composant acheminé, vous vous abonnez au sujet du service pour essayer d'obtenir la valeur qui a été émise dans la garde. OOPs. Où est la valeur ? Elle a déjà été émise, DUH. Utilisez un sujet "cache" !

Voir aussi :

39voto

toxinhead Points 141

Un résumé pratique des différents types d'observables, nom non intuitif je sais lol .

  • Subject - Un abonné ne recevra les valeurs publiées qu'une fois l'abonnement effectué.
  • BehaviorSubject - Les nouveaux abonnés obtiennent la dernière valeur publiée OU la valeur initiale dès leur inscription.
  • ReplaySubject - Les nouveaux abonnés reçoivent la dernière 1-n valeur(s) publiée(s) dès la souscription (uniquement si elle(s) a(ont) été émise(s) précédemment).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X