web-dev-qa-db-fra.com

Angular2: Se désinscrire de http observable en service

Quelle est la meilleure pratique pour se désinscrire au sein d'un service Angular2 d'un abonnement http?

Actuellement, je fais cela, mais je ne sais pas si ce sera la meilleure façon.

import { Injectable } from "@angular/core";
import { Http } from "@angular/http";

import { Subject } from "rxjs/Subject";
import { ISubscription } from "rxjs/Subscription";

@Injectable()
export class SearchService {
    private _searchSource = new Subject<any>();

    public search$ = this._searchSource.asObservable();

    constructor(private _http: Http) {}

    public search(value: string) {
        let sub: ISubscription = this._http.get("/api/search?value=" + value)
            .map(response => <any>response.json())
            .do(data => this._searchSource.next(data))
            .finally(() => sub.unsubscribe()).subscribe();
    }

}
30
NCC-2909-M

Un service dans Angular est un singleton. Cela signifie que le service existera pendant toute la durée de vie de votre application.

La raison pour laquelle vous devez vous désabonner d'un observable est d'éviter les fuites de mémoire. Quand avez-vous des fuites de mémoire? Si quelque chose a été récupéré alors qu'il était encore abonné à un écouteur d'événements, une socket, ...

Étant donné qu'un service Angular ne sera jamais détruit, à moins que votre application entière ne soit détruite, il n'y a aucune raison réelle de vous en désinscrire. .

Conclusion: la désinscription à un service est un peu inutile, car il n'y a aucun risque de fuite de mémoire.

71
KwintenP

Vous n'avez pas besoin de vous désabonner de l'observable créé par Http ou HttpClient car il est fini observable (la valeur ne sera émise qu'une seule fois et complete sera appelée).

Cependant, vous POUVEZ vous désinscrire de l'observable créé par HttpClient pour annuler la demande. Cela signifie que vous n'êtes plus intéressé par les données renvoyées par la demande.

2
Vladimir Prudnikov

Je ne suis pas d'accord avec KwintenP réponse. Oui, en cas d'appels observables à HttpClient, il n'est pas nécessaire de se désinscrire car Vladimir mentionné correctement, mais dans d'autres observables, vous devrez certainement vous désinscrire dans un service.

Voyons un exemple simple: supposons que nous avons un magasin qui envoie des observables et dans le magasin, nous avons un clicker observable qui tire true chaque fois qu'il y a un clic sur la souris droite (pour une raison étrange) Et supposons que nous ayons MyWeirdService qui font ce qui suit:

class MyWeirdService {
  doSomethingUnthinkableManyTimes() {
    this.store.select('clicker').subscribe(() => {
      console.log("Hey what do you know, I'm leaking");
    });
  }
}

this.store.select('clicker') retourne un observable que nous lui enregistrons un nouveau gestionnaire à chaque appel à doSomethingUnthinkableManyTimes sans le nettoyer entraînant une fuite de mémoire qui restera aussi longtemps que le service sera là (durée de vie de l'application dans de nombreux cas)

En fin de compte, vous n'avez pas besoin de vous désinscrire dans le cas ci-dessus de Http car Vladimir l'a bien expliqué, mais dans d'autres cas, vous en aurez peut-être besoin.

1
Kfir Erez