javascript - Trenger RxJS6 asObservable() på et Subject?
Når er asObservable() nødvendig på et Subject (f.eks. BehaviorSubject) for å få et observable av subject? Selve subject kan også kastes til et Observable.
Spørsmål
- Hva er de tekniske forskjellene mellom
name1$ogname2$? - Hvilken bør brukes (
name1$ellername2$)?
Kodeeksempel
import { Observable } from 'rxjs/Observable';
import { BehaviorSubject } from 'rxjs';
export class Person {
private nameSubject: BehaviorSubject<string> = new BehaviorSubject<string>('lorem');
public get name1$(): Observable<string> {
return this.nameSubject.asObservable();
}
public get name2$(): Observable<string> {
return this.nameSubject;
}
public setName(value: string): void {
this.nameSubject.next(value);
}
}
Takk på forhånd for svarene dine!
Svar #1
Generelt anbefales det å bruke asObservable() bare når man bruker RxJS i JavaScript. Med TypeScript kan du bare bruke typekasting, og det vil ikke la deg kalle next() og så videre.
private nameSubject: BehaviorSubject<string> = new BehaviorSubject<string>('lorem');
public nameSubject$: Observable<string> = this.nameSubject;
Dette er den offisielt anbefalte måten å gjøre Subjects om til Observables i TypeScript på.
For detaljer se https://github.com/ReactiveX/rxjs/pull/2408#issuecomment-282077506.
Svar #2
asObservable() oppretter et nytt Observable, som pakker inn Subject, slik at det innpakkede observable ikke har next()-metoden, samt complete() og error(). Jeg tror det gir mer mening i JavaScript, der objektet som returneres ikke er begrenset av sin type. Men i TypeScript kan du skjule disse metodene bare ved å innsnevre typen, det bør være nok i de fleste tilfeller. Du sier bare at et Observable returneres, og en bruker av API-et vet ikke at det er et Subject; selvfølgelig kan det kastes tilbake til Subject, men det er ikke slik en API bør brukes.
Se også: Når bør man bruke asObservable() i rxjs?
