Zwalnianie subskrypcji i zasobów

W niektórych sytuacjach możemy chcieć wypisać się ze strumienia Observable. Wykonanie tego jest całkiem proste, ponieważ wywołanie .subscribe () zwraca funkcję unsubscribe ().

export class AppComponent {

  private data: Observable<string>;
  private value: string;
  private subscribed: boolean;
  private status = "";

    init() {

    this.data = new Observable(observer => {
        let timeoutId = setTimeout(() => {
        observer.next('You will never see this message');
        }, 2000);

        this.status = 'Started';

        var onUnsubscribe = () => {
        this.subscribed = false;
        this.status = 'Finished!';
        clearTimeout(timeoutId);
        }
            return onUnsubscribe;
    });

    let subscription = this.data.subscribe(
        value => this.value = value,
        error => console.log(error),
        () => this.status = 'Finished'
    );
    this.subscribed = true;

    setTimeout(() => {
      subscription.unsubscribe();
    }, 1000);
    }

}

Zobacz przykład [042]

Tworząc Observable możesz również wykorzystać niestandardowe wywołanie zwrotne, onUnsubscribe, które zostanie wywołane, gdy funkcja, która nasłuchuje, zrezygnuje z subskrypcji. Jest to przydatne w przypadku każdego rodzaju czyszczenia, które musi zostać zaimplementowane. Jeśli nie wyczyścimy setTimeout, to wartości będą nadal emitowane, ale nikt nie będzie nasłuchiwał. Aby zaoszczędzić zasoby, powinniśmy zatrzymać emisję wartości. Ważną rzeczą, na którą należy zwrócić uwagę, jest to, że kiedy wywołujesz .unsubscribe (), niszczysz obiekt subskrypcji, który nasłuchuje, dlatego zdarzenie on-complete dołączone do tego obiektu subskrypcji (trzeci parametr subscribe) nie zostanie wywołane.

W większości przypadków nie będziemy musieli jawnie wywoływać metody unsubscribe, chyba że chcemy wcześniej anulować nasze Observable. Domyślnym zachowaniem operacji Observabe jest pozbycie się subskrypcji, gdy tylko zostanie wykonane .complete() lub .error(). Należy pamiętać, że RxJS został zaprojektowany do używania w stylu zwolnij-zapomnij ("fire and forget").