Usualmente uso takeUntil(this.destroySub) cuando necesito suscribirme manualmente a una transmisión en mis componentes. ¿Importa (para el tema (recolección de basura o lo que sea), ya que el siguiente es suficiente para completar la transmisión) si completo el tema o no en ngOnDestroy ?
@Component({...}) class MyComponent { private destroySub = new Subject<void>(); constructor() { of('some stream').pipe( takeUntil(this.destroySub) ).subscribe() } ngOnDestroy():void { this.destroySub.next(); this.destroySub.complete(); } } takeUntil(this.destroySub) es cómo está completando todos los demás observables en su componente, pero esto no completa this.destroySub en sí.
Sí, las asignaturas no tienen una duración limitada, por lo que debe completarlas cuando ya no las necesite.
Al igual que cualquier otro objeto, el GC aún recopilará un Subject una vez que no haya más punteros hacia él. El problema con esta forma de pensar es que es muy fácil filtrar accidentalmente una referencia a este tema. Debido a que es una biblioteca asíncrona, las referencias pueden estar tanto en la pila actual como en el bucle de eventos.
Está trabajando dentro de un marco que puede intentar optimizar sus componentes, por lo que no hay garantía de que la referencia a su componente se elimine dentro de Angular después de llamar a ngOnDestroy. También está pasando referencias a la biblioteca RxJS cada vez que usa takeUntil(this.destroySub) . RxJS actúa como proxy y administra las emisiones por usted en muchos casos, por lo que es posible que se sorprenda con una línea de código relativamente mundana que causa una pérdida de memoria.
Completar un observable limpia toda la instrumentación interna que guarda RxJS para cualquier observable dado y deja tu conciencia clara en ese sentido.
Entonces, sí, aunque (si tiene cuidado y está bien informado) el GC puede limpiar un observable incompleto, no contaría con eso. Si su observable no es finito, entonces hágalo finito de alguna manera. this.destroySub.complete(); Eso funciona para ti.