subscribe angular 6 example
Angular2: Cancelar suscripciĆ³n de http observable en servicio (2)
No es necesario que cancele la suscripción al observable creado por Http
o HttpClient
porque es observable finito (el valor se emitirá solo una vez y complete
llamará complete
).
Sin embargo, PUEDE darse de baja del observable creado por HttpClient
para cancelar la solicitud . Significa que ya no está interesado en los datos devueltos por la solicitud.
¿Cuál es la mejor práctica para cancelar la suscripción dentro de un servicio Angular2 desde una suscripción http?
Actualmente hago esto pero no estoy seguro de si esta será la mejor manera.
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();
}
}
Un servicio en Angular es un singleton. Esto significa que el servicio existirá durante toda la vida útil de su aplicación.
La razón por la que necesita darse de baja de un observable, es para evitar pérdidas de memoria. ¿Cuándo tienes fugas de memoria? Si algo se ha recolectado como basura mientras aún estaba suscrito a un observable, detector de eventos, socket, ...
Dado que un servicio Angular nunca se destruye, a menos que se destruya toda su aplicación, no hay ninguna razón real para cancelar la suscripción. Lo observable se completará o se producirá un error o continuará mientras lo haga su aplicación.
Conclusión: la cancelación de la suscripción en un servicio no tiene sentido, ya que no hay posibilidad de fugas de memoria.