Saltar al contenido

Angular2: darse de baja de http observable en el servicio

Posterior a consultar con expertos en esta materia, programadores de varias ramas y maestros dimos con la respuesta al dilema y la dejamos plasmada en esta publicación.

Solución:

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 pérdidas de memoria? Si algo ha sido recolectado como basura mientras todavía 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 una razón real para cancelar la suscripción. El observable se completará o generará un error o continuará mientras lo haga su aplicación.

Conclusión: darse de baja de un servicio no tiene sentido, ya que no hay posibilidad de pérdidas de memoria.

No estoy de acuerdo con la respuesta de KwintenP. Sí, en el caso de una llamada observable a HttpClient, no es necesario cancelar la suscripción como lo mencionó Vladimir correctamente; sin embargo, en otros observables, es posible que definitivamente deba cancelar la suscripción en un servicio.

Veamos un ejemplo simple: supongamos que tenemos una tienda que envía observables y en la tienda tenemos un clicker observable ese fuego true cada vez que hay un clic con el botón derecho del mouse (por alguna extraña razón) Y supongamos que tenemos MyWeirdService que hacen lo siguiente:

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

this.store.select('clicker') devuelve un observable que registramos un nuevo controlador en cada llamada a doSomethingUnthinkableManyTimes sin limpiarlo, lo que resulta en una fuga de memoria que permanecerá mientras el servicio esté allí (vida útil de la aplicación en muchos casos)

En pocas palabras, no necesita darse de baja en el caso anterior de Http como lo explicó bien Vladimir, pero en otros casos es posible que lo necesite.

————– Edición ————

Para resolver ese problema en mi ejemplo, simplemente agregue take(1) y cancelará la suscripción automáticamente después de que se active cada transmisión:

class MyWeirdService 
  doSomethingUnthinkableManyTimes() 
    this.store.select('clicker')
     .pipe(take(1))
     .subscribe(() => 
      console.log("What a relief, I'm not leaking anymore");
     );
  

No es necesario darse de baja de observable creado por Http o HttpClient porque es observable finito (el valor se emitirá solo una vez y complete sera llamado).

Sin embargo, PUEDE darse de baja del observable creado por HttpClient a cancelar la solicitud. Significa que ya no está interesado en los datos devueltos por la solicitud.

Comentarios y calificaciones del post

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *