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

  1. Hva er de tekniske forskjellene mellom name1$ og name2$?
  2. Hvilken bør brukes (name1$ eller name2$)?

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?

Relaterte artikler