Loading ist kein Boolean
isLoading: boolean ist eine Vereinfachung, die in einfachen Fällen ausreicht und in allen anderen Fällen schmerzt.
Das Problem
Abschnitt betitelt „Das Problem“Ein Boolean kann nur zwei Zustände modellieren: lädt oder lädt nicht. Ein echter asynchroner Prozess hat mehr:
- Idle — noch nichts angefragt
- Loading — Anfrage läuft
- Success — Daten vorhanden
- Error — Anfrage fehlgeschlagen (mit welchem Fehler?)
- Refreshing — Daten vorhanden, neue werden geladen
Mit einem Boolean kollabiert das alles in „true/false” — und der Rest landet als impliziter Zustand in drei weiteren Variablen, die eigentlich nie hätten sein sollen.
Das Ergebnis
Abschnitt betitelt „Das Ergebnis“// So entsteht inkonsistenter Zustand:isLoading = false;data: Task[] | null = null;error: string | null = null;// Was bedeutet: isLoading=false, data=null, error=null?// → Noch gar nicht geladen? Oder Erfolg mit leerer Liste?Die Alternative: Discriminated Union
Abschnitt betitelt „Die Alternative: Discriminated Union“type LoadingState<T> = { status: 'idle' } | { status: 'loading' } | { status: 'success'; data: T } | { status: 'error'; message: string };Jeder Zustand ist eindeutig. Kein inkonsistentes Kombination aus drei Flags. Das Template prüft status und weiß, was zu rendern ist.
Im Signal Store
Abschnitt betitelt „Im Signal Store“NgRx Signal Store und ähnliche Ansätze erlauben, diesen Zustand sauber zu halten und abzuleiten — ohne manuelle Boolean-Synchronisation.