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 bruke
myObservable.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);
}
