web-dev-qa-db-fra.com

Observable vs sujet et asObservable

J'apprends les RxJ, je cherche une confirmation ou une correction sur mon hypothèse.

J'essaie de rendre un public en lecture seule observable dans un service que je peux utiliser .next() on à divers endroits de ma classe de service . Je me demande si c'est la bonne façon de procéder:

private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable.asObservable();
  • L'utilisateur peut s'abonner à myObservable$
  • Je peux utilisermyObservable.next(...);

Cela fonctionne parfaitement, mais j'ai suffisamment d'expérience pour savoir que je ne suis peut-être qu'un idiot involontaire (RxJS est énorme). Ce modèle et cet objet sont-ils corrects pour ledit cas d'utilisation?

14
user9298624

Ce que vous faites est correct. Il y a cependant encore une notation un peu plus courte. Puisque Subject est déjà un Observable (il hérite de la classe Observable), vous pouvez laisser la vérification de type à TypeScript:

private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable;

Tout consommateur de votre service peut s'abonner à myObservable$ Mais ne pourra pas appeler myObservable$.next() car TypeScript ne vous le permettra pas (la classe observable n'a pas de fonction next() méthode).

C'est en fait la façon recommandée de le faire et RxJS n'utilise jamais en interne asObservable de toute façon. Pour une discussion plus détaillée, voir:

Voir une question très similaire: Les sujets rxjs devraient-ils être publics dans la classe?

8
martin

Dans le projet, nous utilisons ce type d'Observables, cela vous donne une encapsulation appropriée à votre observable privé, mais vous pouvez toujours appeler next() en utilisant une méthode publique.

      private sourceName = new Subject<T>();
      name = this.sourceProductName.asObservable();

      sendName(item: T) {
        this.sourceName.next(item);
      }
3
Kraken