10.7.2023

Angular's bequeme Art, Subscriptions mit "takeUntilDestroyed" zu beenden

Ein wichtiger Aspekt bei der Arbeit mit Observables in Angular ist das ordnungsgemäße Beenden von Subscriptions, um Memory Leaks zu vermeiden. Bisher haben Entwickler oft "takeUntil" in Kombination mit einem Subject verwendet, um Subscriptions zu beenden. Es gibt jedoch eine neue und bequemere Methode in Angular, die die Verwendung von Subjects und das manuelle Auslösen im onDestroy Lifecycle-Hook überflüssig macht. Diese Methode nennt sich "takeUntilDestroyed".

"takeUntilDestroyed" ist eine Erweiterung, die als Alternative zu "takeUntil" verwendet werden kann und es ermöglicht, Subscriptions automatisch zu beenden, ohne den onDestroy Lifecycle-Hook zu verwenden. Dies erleichtert die Implementierung und sorgt dafür, dass keine Subscriptions versehentlich offengelassen werden.

Der große Vorteil von "takeUntilDestroyed" besteht darin, dass es in der Lage ist, den onDestroy Lifecycle-Hook für Sie zu verwalten. Dies ist besonders hilfreich in Fällen, in denen die Verwendung des onDestroy Hooks nicht möglich oder unpraktisch ist, beispielsweise bei Verwendung von Arrow-Funktionen oder in Callback-Funktionen.

Hier ist ein Beispiel, wie "takeUntilDestroyed" in einem Angular-Komponentenbeispiel verwendet werden kann:

import { Component, OnInit, OnDestroy, Inject } from '@angular/core';
import { takeUntilDestroyed } from 'take-until-destroyed';
import { AuthService } from 'pfad/zum/auth-service';
import { DestroyRef } from 'pfad/zum/destroy-ref';

@Component({
  selector: 'app-example',
  template: '...',
})
export class ExampleComponent implements OnInit, OnDestroy {
  constructor(
    private authService: AuthService,
    @Inject(DestroyRef) private destroyRef: DestroyRef
  ) {}

  ngOnInit() {
    this.authService
      .login(username)
      .pipe(takeUntilDestroyed(this.destroyRef))
      .subscribe({
        // ... hier kommen die Subscription-Handler
      });
  }

  ngOnDestroy() {
    // Hier wird onDestroy nicht mehr benötigt
  }
}

In diesem Beispiel wird die "takeUntilDestroyed"-Methode verwendet, um das automatische Beenden der Subscription zu ermöglichen. Anstatt den onDestroy Lifecycle-Hook zu verwenden, wird die Instanz von "DestroyRef" injiziert und an "takeUntilDestroyed" übergeben. Dadurch wird sichergestellt, dass die Subscription automatisch beendet wird, wenn die Komponente zerstört wird.

Es ist wichtig, darauf hinzuweisen, dass "takeUntilDestroyed" nur innerhalb eines Kontexts verwendet werden kann, der Injektion unterstützt, wie z.B. einem Konstruktor, einer Factory-Funktion, einem Feld-Initializer oder einer Funktion, die mit "runInInjectionContext" verwendet wird. Falls der direkte Injektionskontext nicht verfügbar ist, kann "DestroyRef" verwendet werden, um die benötigte Kontrolle über die Zerstörung zu erhalten.

Mit der Verwendung von "takeUntilDestroyed" wird das Beenden von Subscriptions in Angular noch einfacher und weniger fehleranfällig. Es spart Entwicklern Zeit und sorgt für eine saubere Verwaltung von Subscriptions, um Memory Leaks zu vermeiden.

Dennis

Softwareentwickler

Gitlab
Zur Übersicht

Standort Hannover

newcubator GmbH
Bödekerstraße 22
30161 Hannover

Standort Dortmund

newcubator GmbH
Westenhellweg 85-89
44137 Dortmund