javascript - Observable vs Subject og asObservable


Jeg lærer RxJs, jeg søker bekreftelse eller korrigering på min antakelse.

Jeg prøver å lage en offentlig kun lesbar observerbar i en tjeneste som jeg kan bruke .next() på på forskjellige steder i tjenesteklassen min. Jeg lurer på om dette er den riktige måten å gjøre det på:

private myObservable = new Subject<T>();
public myObservable$: Observable<T> = this.myObservable.asObservable();
  • Brukeren kan abonnere på myObservable$
  • Jeg kan brukemyObservable.next(...);

Det fungerer perfekt, men jeg har nok erfaring til å vite at jeg kanskje bare er en uvitende idiot (RxJS er enormt). Er dette riktig mønster og riktig objekt for nevnte brukstilfelle?

Svar #1

Det du gjør er korrekt. Det finnes imidlertid fortsatt en litt kortere notasjon. Siden Subject allerede er en Observable (det arver Observable-klassen) kan du la typetesting være opp til TypeScript:

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

Enhver forbruker av tjenesten din kan abonnere på myObservable$, men vil ikke kunne kalle myObservable$.next() fordi TypeScript ikke lar deg gjøre det (Observable-klassen har ingen next()-metode).

Dette er faktisk den anbefalte måten å gjøre det på, og RxJS bruker uansett aldri asObservable internt. For mer detaljert diskusjon, se:

  • https://github.com/ReactiveX/rxjs/pull/2408

  • https://github.com/ReactiveX/rxjs/issues/2391

Se et veldig lignende spørsmål: Bør rxjs-objekter være offentlige i klassen?

Svar #2

I prosjektet bruker vi denne typen Observables, dette gir deg riktig innkapsling av din private observable, men du kan fortsatt kalle next() ved å bruke en offentlig metode.

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

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

Relaterte artikler