Skip to content

Sammlung praktischer Muster

Wenn Sie die Grundlagen von RxJS beherrschen, stellt sich die Frage, wie Sie es in der konkreten Anwendungsentwicklung einsetzen können. In diesem Kapitel werden konkrete Implementierungsmuster für in der Praxis häufig anzutreffende Szenarien vorgestellt.

Warum sind praktische Muster wichtig?

Auch wenn Sie die einzelnen Operatoren von RxJS verstehen, brauchen Sie Erfahrung und Wissen über Patterns, um sie zur Lösung realer Probleme zu kombinieren. Durch das Erlernen praktischer Patterns:

  • Beschleunigung der Entwicklung - Sie müssen das Rad nicht neu erfinden und können bewährte Muster anwenden
  • Verbesserung der Qualität - Erlernen von Best Practices wie Fehlerbehandlung und Vermeidung von Speicherlecks
  • Verbesserte Wartbarkeit - konsistente Muster verbessern die Lesbarkeit und Wartbarkeit des Codes
  • Fehlerbehebung - Identifizierung der Ursache von Problemen und Auswahl geeigneter Lösungen

Aufbau dieses Kapitels

Die praktischen Muster sind in drei Phasen unterteilt, die sich nach Schwierigkeitsgrad und Häufigkeit der Anwendung richten.

Kernmuster (am häufigsten)

Dies sind die Grundmuster, die in der Praxis am häufigsten verwendet werden. Beherrschen Sie diese zuerst.

MusterInhaltHauptziel
UI-EreignisverarbeitungUI-Operationen wie Klick, Scrollen, Drag & DropFront-End allgemein
API-AufrufeHTTP-Kommunikation, parallele/serielle Verarbeitung, FehlerbehandlungWeb-API-Integration
FormularverarbeitungValidierung in Echtzeit, automatisches Speichern, Verknüpfung mehrerer FelderFormularimplementierung

Erweiterte Muster

Erweiterte Muster für komplexere Szenarien.

MusterInhaltHauptziel
Erweiterte FormularmusterJSON-Patch, automatisches Speichern großer Formulare, Undo/Redo, kollaborative BearbeitungUnternehmensformulare
Echtzeit-DatenverarbeitungWebSockets, SSE, Polling, VerbindungsverwaltungEchtzeitkommunikation
Caching-StrategienDaten-Caching, TTL, Invalidierung, Offline-UnterstützungLeistungsoptimierung

Spezialmuster

Spezialisierte Muster für bestimmte Herausforderungen.

MusterInhaltHauptziel
Fehlerbehandlung in der PraxisAPI-Aufruffehler, Wiederholungsstrategien, globale FehlerbehandlungFehlerverwaltung
Bedingte Verzweigung in subscribeVermeidung von Verzweigungen in subscribe, Verzweigungsmethoden in PipelinesCodequalität

Lernprogression

Es wird empfohlen, dass Anfänger in der Reihenfolge von Phase 1 an vorgehen. Insbesondere die "API-Aufrufe" und die "Formularverarbeitung" sind wesentliche Muster in der Praxis.

Aufbau der Muster

Jede Musterseite wird durch die folgende Struktur beschrieben:

  1. Problembeschreibung - das Problem, das dieses Muster löst
  2. Basisimplementierung - das einfachste Implementierungsbeispiel
  3. Praktische Beispiele - konkreter Code, der in der Praxis verwendet werden kann
  4. Vorher/Nachher-Vergleich - Vergleich des Codes vor und nach den Verbesserungen
  5. Vorsichtsmaßnahmen und Best Practices - Häufige Fehler und Gegenmaßnahmen
  6. TypeScript-Typdefinitionen - wie man Typsicherheit implementiert
  7. Testcode - wie man Muster testet
  8. Leistungsüberlegungen - Speicherlecks und Leistungsoptimierung

Leitlinien für die Musterauswahl

Leitlinien für die Auswahl des geeigneten Musters je nach der zu implementierenden Funktionalität.

Beim Umgang mit Benutzereingaben

Beim Umgang mit Datenabfragen

Für verbesserte Fehlerbehandlung

Konzepte für die Implementierung

In diesem Abschnitt werden die grundlegenden Konzepte für die Implementierung von RxJS-Mustern vorgestellt.

1. Deklarativ denken

Drücken Sie das, was Sie tun wollen, deklarativ aus und vermeiden Sie prozeduralen Code.

typescript
// ❌ Prozedural (imperativ)
let result = [];
source.subscribe(value => {
  if (value > 10) {
    const transformed = value * 2;
    result.push(transformed);
  }
});

// ✅ Deklarativ
const result$ = source.pipe(
  filter(value => value > 10),
  map(value => value * 2)
);

2. Prozesse in Pipelines aufbauen

Komplexe Prozesse durch die Kombination kleiner Operatoren aufbauen.

typescript
const searchResults$ = searchInput$.pipe(
  debounceTime(300),           // 300ms auf Eingabe warten
  distinctUntilChanged(),      // Duplikate eliminieren
  filter(query => query.length >= 2), // Suche ab 2 Zeichen
  switchMap(query => searchAPI(query)), // API-Aufruf
  catchError(err => of([]))    // Leeres Array bei Fehler
);

3. Speicherlecks verhindern

Eine ordnungsgemäße Verwaltung der Abonnements ist unerlässlich.

typescript
// ✅ Automatische Kündigung mit takeUntil
private destroy$ = new Subject<void>();

ngOnInit() {
  this.data$.pipe(
    takeUntil(this.destroy$)
  ).subscribe(/*...*/);
}

ngOnDestroy() {
  this.destroy$.next();
  this.destroy$.complete();
}

4. Fehlerbehandlung nicht vergessen

Implementierung einer Fehlerbehandlung für alle asynchronen Prozesse.

typescript
// ✅ Ordnungsgemäße Fehlerbehandlung mit catchError
apiCall$.pipe(
  retry(3),
  catchError(err => {
    console.error('API error:', err);
    return of(defaultValue);
  })
).subscribe(/*...*/);

5. Typsicherheit nutzen

Nutzen Sie das Typsystem von TypeScript optimal aus.

typescript
interface User {
  id: number;
  name: string;
  email: string;
}

// ✅ Klare Typdefinitionen
const users$: Observable<User[]> = fetchUsers();
const activeUsers$: Observable<User[]> = users$.pipe(
  map(users => users.filter(u => u.isActive))
);

Bezug zum vorhandenen Wissen

Die Muster in diesem Kapitel wenden das in den vorherigen Kapiteln gelernte Wissen in der Praxis an.

Praktisches MusterVerwandtes KapitelAnzuwendendes Wissen
UI-EreignisverarbeitungKapitel 4: OperatorendebounceTime, throttleTime, distinctUntilChanged
API-AufrufeKapitel 6: FehlerbehandlungcatchError, retry, timeout
FormularverarbeitungKapitel 3: Creation FunctionscombineLatest, withLatestFrom
Erweiterte FormularmusterKapitel 4: Transformationsoperatorenpairwise, scan, bufferTime, concatMap
EchtzeitdatenKapitel 5: SubjectSubject, BehaviorSubject, shareReplay
Caching-StrategieKapitel 2: Cold/HotshareReplay, share
FehlerbehandlungKapitel 6: FehlerbehandlungcatchError, retry, retryWhen
Subscribe-VerzweigungKapitel 10: Anti-PatternsVermeidung von Anti-Patterns

Wann überprüfen

Bevor Sie sich mit den einzelnen Mustern befassen, sollten Sie die entsprechenden Kapitel lesen, um ein besseres Verständnis zu erlangen.

Häufig gestellte Fragen

Q1: Von welchem Muster sollte ich lernen?

A: Wir empfehlen, in der Reihenfolge zu lernen, die in der Praxis am häufigsten verwendet wird.

  1. API-Aufrufe - die Grundlagen der Webentwicklung
  2. Formularverarbeitung - Verarbeitung von Benutzereingaben
  3. UI-Ereignisverarbeitung - interaktive Benutzeroberfläche
  4. Fehlerbehandlung - robuste Anwendungen
  5. Andere Muster - je nach Projektanforderungen

Q2: Kann ich die Muster so verwenden, wie sie sind?

A: Ja. Die Muster in diesem Kapitel sind für den praktischen Einsatz gedacht. Dennoch:

  • Passen Sie sie entsprechend den Anforderungen Ihres Projekts an
  • Berücksichtigen Sie Leistung und Speicherverbrauch
  • Befolgen Sie die Kodierungskonventionen Ihres Teams

Q3: Kann ich es mit Angular/React/Vue verwenden?

A: Ja. Die Muster in diesem Kapitel sind Framework-unabhängig. Allerdings:

  • Siehe Kapitel 15: Framework-Integration (in Vorbereitung) für Framework-spezifische Integrationsmethoden
  • Die Abmeldung ist für den Lebenszyklus eines jeden Frameworks erforderlich

Zusammenfassung

Die Sammlung praktischer Muster ist ein konkreter Leitfaden für den Einsatz von RxJS in realen Projekten.

Wichtige Punkte

  • Von den Kernmustern in Phase 1 der Reihe nach lernen
  • Verbesserungen mit Vorher/Nachher-Vergleichen verstehen
  • Speicherleck-Prävention immer implementieren
  • Fehlerbehandlung nicht vergessen
  • Typsicherheit nutzen

Lerntipps

  • Code praktisch ausführen, um das Verständnis zu vertiefen
  • Versuchen Sie, es auf Ihre eigenen Projekte anzuwenden
  • Kombinieren Sie Muster, um komplexe Prozesse zu erstellen
  • Lernen Sie auch Testcode

Als nächsten Schritt empfehlen wir, mit dem am häufigsten verwendeten API-Aufrufmuster zu beginnen.

Referenz-Ressourcen

Veröffentlicht unter CC-BY-4.0-Lizenz.