javascript / intermediate
Snippet
Abbrechen laufender asynchroner Fetch-Anfragen in React-Effects mittels AbortController
Beim Abrufen von Daten in einem useEffect-Hook können schnelle Prop-Änderungen oder das Unmounten von Komponenten zu Race Conditions und Speicherlecks führen. Durch die Kombination des standardmäßigen Web-API AbortController mit dem fetch-Signal werden laufende HTTP-Anfragen in der Aufräumfunktion des Effects sauber abgebrochen und erwartete 'AbortError'-Ausnahmen ignoriert.
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
import { useState, useEffect } from 'react';function UserProfile({ userId }) {const [user, setUser] = useState(null);useEffect(() => {const controller = new AbortController();const { signal } = controller;async function loadUserData() {try {const res = await fetch(`/api/users/${userId}`, { signal });const data = await res.json();setUser(data);} catch (err) {if (err.name !== 'AbortError') {console.error('Fetch failed:', err);}}}loadUserData();return () => {controller.abort();};}, [userId]);return user ? <div>{user.name}</div> : <p>Loading...</p>;}
react
Erklärung
1
const controller = new AbortController();
Instanziiert einen neuen Controller, um ein Abbruchsignal für asynchrone Operationen zu erzeugen.
2
const res = await fetch(`/api/users/${userId}`, { signal });
Übergibt das Abort-Signal des Controllers an fetch, um den Netzwerkzyklus an die Komponente zu binden.
3
if (err.name !== 'AbortError') {
Unterscheidet gewollte Abbrüche durch Aufräumarbeiten von echten Netzwerk- oder Verarbeitungsfehlern.
4
return () => { controller.abort(); };
Aufräum-Callback, der bei Abhängigkeitswechseln oder beim Unmounten ausgeführt wird und die Anfrage abbricht.