Existen diferentes patrones para eliminar suscripciones en componentes angulares. He estado usando el patrón Subject / takeUntil , de esta forma:
export class FooComponent implements OnDestroy { private destroy$ = new Subject<void>(); ... source$.pipe(takeUntil(this.destroy$)).subscribe(...); ... ngOnDestroy() { this.destroy$.next(); } } Hoy me han dicho que agregue otra línea a ngOnDestroy :
this.destroy$.complete(); Después de investigar un poco, aparece en algunos ejemplos en línea y no en otros, pero de cualquier manera no veo el punto. Mirando el código fuente de Subject.complete , recorrerá los observadores internos y los completará. Asumiendo que no nos suscribimos directamente al tema destroy$ , ¿no se supone que esta lista de observadores internos siempre debe permanecer vacía? Si ese es el caso, ¿no es redundante esa llamada a this.destroy$.complete() ?
No necesita llamar a complete() si está usando destroy$ solo para los operadores takeUntil() .
Cuando destroy$ emita el next takeUntil() completará la cadena que también cancelará la suscripción de destroy$ y, por lo tanto, no habrá suscriptores, por lo que complete() no debería ser necesario.
Por cierto, también he visto personas que usan complete() en esta situación. No puedo encontrar ningún ejemplo en este momento, pero en contraste ngrx/component-store solo está llamando a next() .