0Pricing
React Academy · Lektion

Race Conditions und Effect-Cleanup

Verwenden Sie AbortController in useEffect, um veraltete fetch-Anfragen bei einem erneuten Rendering abzubrechen.

Race Conditions und Effect-Cleanup ist eine kostenlose React Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des React Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.

Willkommen

In dieser Lektion lernen Sie, wie Race Conditions in React-Effekten entstehen, die Daten abrufen, und wie Sie sie mithilfe von AbortController und einer geeigneten Bereinigung vermeiden.

Was ist eine Race Condition?

Eine Race Condition tritt auf, wenn zwei asynchrone Vorgänge in einer unvorhersehbaren Reihenfolge abgeschlossen werden. Wenn ein Benutzer in React schnell zwischen Elementen navigiert, kann ein langsamer Abruf für Element A nach dem Abruf für Element B abgeschlossen werden und veraltete Daten anzeigen.

Der Fehler: Veraltete Abrufantwort

Ohne Bereinigung laufen beide Abrufe weiter, wenn die Komponente mit einer neuen ID erneut gerendert wird, bevor der alte Abruf abgeschlossen ist. Der ältere, langsamere Abruf kann dann neuere Daten im State überschreiben.
useEffect(() => {
  fetch('/api/item/' + id)
    .then(r => r.json())
    .then(data => setData(data)); // may run AFTER a newer fetch!
}, [id]);

Lösung 1: Ignore-Flag

Eine einfache Lösung: Setzen Sie im Effekt ein boolesches `ignore`-Flag. Die Bereinigungsfunktion setzt es auf true. Der Callback des Abrufs prüft das Flag, bevor er setState aufruft.
useEffect(() => {
  let ignore = false;
  fetch('/api/item/' + id)
    .then(r => r.json())
    .then(data => { if (!ignore) setData(data); });
  return () => { ignore = true; };
}, [id]);

Lösung 2: AbortController

AbortController ist der moderne Standard. Erstellen Sie im Effekt einen Controller, übergeben Sie dessen Signal an fetch und brechen Sie den Vorgang in der Bereinigungsfunktion ab. Der Abruf löst einen AbortError aus, den Sie ignorieren können.
useEffect(() => {
  const controller = new AbortController();
  fetch('/api/item/' + id, { signal: controller.signal })
    .then(r => r.json())
    .then(data => setData(data))
    .catch(err => {
      if (err.name === 'AbortError') return; // expected
      setError(err.message);
    });
  return () => controller.abort();
}, [id]);

AbortController mit async/await

Verwenden Sie mit asynchronen Funktionen innerhalb von useEffect einen try/catch-Block. Ignorieren Sie AbortError im catch-Block.
useEffect(() => {
  const ctrl = new AbortController();
  async function load() {
    try {
      const res = await fetch('/api/' + id, { signal: ctrl.signal });
      const json = await res.json();
      setData(json);
    } catch (e) {
      if (e.name !== 'AbortError') setError(e.message);
    }
  }
  load();
  return () => ctrl.abort();
}, [id]);

Bereinigung ist immer erforderlich

Fügen Sie immer eine Bereinigung hinzu, selbst wenn Race Conditions unwahrscheinlich sind, zum Beispiel bei einem einmaligen Abruf beim Mounten. In React 18 StrictMode werden Effekte zweimal ausgeführt – ohne Bereinigung kann die erste, verworfene Anfrage den State verfälschen.

Die useEffect-Stolperfalle bei async

Der Callback von useEffect darf nicht `async` sein. Definieren Sie innerhalb des Effekts eine asynchrone Funktion und rufen Sie sie sofort auf – oder verwenden Sie eine normale Funktion mit .then()/.catch().
useEffect(() => {
  // useEffect callback is NOT async
  async function fetchData() { /* ... */ }
  fetchData(); // call it
  return () => ctrl.abort();
}, [id]);

Bibliotheken erledigen das für Sie

React Query, SWR und RTK Query behandeln Race Conditions, Abbruch und Bereinigung automatisch. Bei Verwendung dieser Bibliotheken müssen Sie AbortController nicht manuell programmieren.

Race Conditions testen

So testen Sie Race Conditions manuell: Öffnen Sie die Netzwerk-Devtools, stellen Sie die Drosselung auf „Slow 3G“ und klicken Sie schnell zwischen Elementen. Ohne Bereinigung sehen Sie kurz veraltete Daten. Mit AbortController wird nur das zuletzt ausgewählte Element angezeigt.

Kurze Überprüfung

Was bewirkt der Aufruf von controller.abort() in einer Bereinigungsfunktion von useEffect?

Zusammenfassung

Race Conditions treten auf, wenn die Antwort eines veralteten Abrufs den State nach einem neueren Abruf aktualisiert. Beheben Sie sie mit einem Ignore-Flag oder AbortController. Brechen Sie Vorgänge in der useEffect-Bereinigung immer ab oder ignorieren Sie sie. Bibliotheken wie React Query erledigen das automatisch.

Als Nächstes

Nächste Lektion: **useTransition for Non-Blocking UI Updates** – Sie verpacken aufwendige State-Aktualisierungen in startTransition, damit die Benutzeroberfläche reaktionsfähig bleibt.

Häufig gestellte Fragen

Ist die Lektion „Race Conditions und Effect-Cleanup“ kostenlos?

Ja — der vollständige Text von „Race Conditions und Effect-Cleanup“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des React Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der React Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Race Conditions und Effect-Cleanup“?

Verwenden Sie AbortController in useEffect, um veraltete fetch-Anfragen bei einem erneuten Rendering abzubrechen. Du übst React Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um React Academy zu starten?

Keine Vorkenntnisse erforderlich. React Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Race Conditions und Effect-Cleanup“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser React Academy-Lektion Code schreiben und ausführen?

Ja. Jede React Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Race Conditions und Effect-Cleanup
  2. useTransition für blockierungsfreie UI-Updates
  3. useDeferredValue zur Eingabe-Entprellung
  4. Suspense für Daten- und Code-Grenzen
← Zurück zu React Academy