web-dev-qa-db-fra.com

Quelle est la sémantique des différents sujets RxJS?

La documentation sur le sujet est rare et il est difficile d'y découvrir un "point d'entrée".

19
Ivan Kleshnin

La sémantique diffère selon le type de sujets. Je vais les diviser en deux types: la vanille (Rx.Subject) Et les sujets à usage spécial (les trois autres). Les sujets spécialisés partagent une partie de la sémantique du sujet Vanille avec quelques mises en garde en raison de leur spécialisation (par exemple, le comportement de complétion/reconnexion).

Sémantique Vanilla Rx.Subject

  1. Principales caractéristiques

    • les sujets implémentent l'observateur, l'interface observable (et l'interface jetable car ils ont un gestionnaire dispose sur leur prototype). Cela signifie, entre autres, qu'ils ont:
      • interface d'observateur: méthode onNext, onError, onComplete
      • interface observable: méthode subscribe
    • vous pouvez transposer un sujet en observateur ou en observable, en masquant l'implémentation des interfaces supplémentaires (cf. .asObserver() , et .asObservable() ) si besoin est
    • le sujet étant observable, vous pouvez y souscrire plusieurs observateurs. Cet observable diffusera ensuite ses données à tous ses observateurs. En interne, le sujet maintient un éventail d'observateurs.
    • le sujet étant un observateur, vous pouvez vous abonner à tout observable
    • l'observateur et l'observable qui composent le sujet étant deux entités distinctes, vous pouvez les utiliser indépendamment l'une de l'autre si tel est votre cas d'utilisation.
    • disposesi un sujet sera désinscrire tous les observateurs et libérer les ressources.
    • Les sujets ne prennent pas d'ordonnanceur mais supposent plutôt que toute la sérialisation et l'exactitude grammaticale sont gérées par l'appelant du sujet.
    • Le comportement par défaut des sujets est d'émettre de manière synchrone leurs valeurs aux observateurs, en commençant par le premier observateur abonné au dernier . Dans la plupart des cas, l'ordre n'aura pas d'importance, dans d'autres il le sera.

Je cite un aspect clé de contrat et grammaire Rxjs :

Cette grammaire permet aux séquences observables d'envoyer n'importe quelle quantité (0 ou plus) de messages onNext à l'instance d'observateur abonnée, éventuellement suivie d'un seul message de réussite (onCompleted) ou d'échec (onError).

  • un sujet Vanilla (créé avec new Rx.Subject()) implémente cette grammaire: lorsque onCompleted a été appelé une fois, tous les appels suivants à onNext sont ignorés. Le deuxième appel de onCompleted sur le même observateur est également ignoré. Si un observateur s'abonne au côté observable du sujet, son rappel onComplete sera immédiatement appelé ( http://jsfiddle.net/cLf6Lqsn/1/ ).

    1. Création

      • new Rx.Subject()

    Renvoie un sujet qui relie son observateur à son observable ( jsfiddle ). Cet exemple est tiré de l'officiel documentation et décrit comment utiliser les sujets comme proxys. Le sujet est abonné à une source (côté observateur), et est également écouté par des observateurs (côté observable). Tout appel à onNext (côté observateur) entraîne le côté observable à appeler onNext avec la même valeur pour chacun de ses observateurs.

    • Rx.Subject.create(observer, observable)

    Crée un sujet à partir de l'observateur spécifié et observable. Ces deux-là ne sont pas nécessairement liés. Un bon exemple peut être vu dans l'implémentation de Rx.Dom.fromWebSocket qui retourne un sujet utilisé pour envoyer et recevoir des données à partir d'un socket. Le côté observateur du sujet envoie des données à la prise. Le côté observable est utilisé pour écouter les données entrantes du socket. De plus, un sujet créé de cette façon n'a PAS de méthode dispose.

Sémantique spécialisée Rx.Subject

  • Cette documentation reactivex.io couvre assez bien la plupart de la sémantique des sujets spécialisés.
  • Les autres points intéressants à mentionner concernent les comportements passés.
  • Des exemples de code illustrant le comportement sont ici pour async , behavior , replay

J'espère que je ne me suis pas trop trompé. Je serai heureux d'être corrigé. Dernière remarque, cela devrait être valable pour RxJS v4.

Pour une explication détaillée du comportement des observables froids/chauds, on peut se référer à: Observables chauds et froids: existe-t-il des opérateurs "chauds" et "froids"?

39
user3743222