Zum Inhalt springen

Loading ist kein Boolean

isLoading: boolean ist eine Vereinfachung, die in einfachen Fällen ausreicht und in allen anderen Fällen schmerzt.

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.

// 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?
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.

NgRx Signal Store und ähnliche Ansätze erlauben, diesen Zustand sauber zu halten und abzuleiten — ohne manuelle Boolean-Synchronisation.