javascript / intermediate
Snippet
Abbrechen laufender Fetch-Anfragen mit AbortController in useEffect
Wenn Komponenten vor Abschluss einer asynchronen Anfrage unmounten oder sich Props ändern, kann das Setzen des Zustands Speicherlecks oder Race Conditions verursachen. Die Instanziierung eines AbortControllers in useEffect und die Übergabe des Signals an fetch ermöglicht einen sauberen Abbruch beim Cleanup, während das Ausfiltern des 'AbortError' unerwünschte Fehleranzeigen verhindert.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import { useState, useEffect } from 'react';export function UserProfile({ userId }) {const [user, setUser] = useState(null);const [fetchError, setFetchError] = useState(null);useEffect(() => {const controller = new AbortController();const { signal } = controller;async function loadUserData() {try {setFetchError(null);const res = await fetch(`/api/users/${userId}`, { signal });if (!res.ok) throw new Error(`HTTP error: ${res.status}`);const data = await res.json();setUser(data);} catch (err) {if (err.name !== 'AbortError') {setFetchError(err.message);}}}loadUserData();return () => controller.abort();}, [userId]);if (fetchError) return <p role="alert">Error: {fetchError}</p>;if (!user) return <p>Loading...</p>;return <div><h1>{user.name}</h1><p>{user.email}</p></div>;}
react
Erklärung
1
const controller = new AbortController();
Erstellt eine neue AbortController-Instanz gebunden an den aktuellen Effekt-Lebenszyklus.
2
const res = await fetch(`/api/users/${userId}`, { signal });
Übergibt das Abort-Signal des Controllers an die Fetch-API, um den Netzwerkzyklus zu steuern.
3
if (err.name !== 'AbortError') {
Ignoriert beabsichtigte Abbrüche, damit sie nicht den Fehlerzustand der Benutzeroberfläche füllen.
4
return () => controller.abort();
Bricht ausstehende Netzwerkanfragen sofort ab, wenn die Komponente unmountet oder sich die userId ändert.