javascript / intermediate
Snippet
Abbrechen ausstehender Fetch-Anfragen beim Unmounten von Komponenten mit AbortController
Wenn Komponenten unmountet werden oder sich Abhängigkeiten ändern, bevor ein asynchroner Fetch abgeschlossen ist, können Statusaktualisierungen zu Race Conditions führen. Die Verwendung des nativen AbortController von JavaScript ermöglicht die Übergabe eines Signals an fetch, das in der Cleanup-Funktion von useEffect ausgelöst werden kann. Die Prüfung auf err.name !== 'AbortError' verhindert, dass beabsichtigte Abbrüche als Fehler gewertet werden.
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 React, { useState, useEffect } from 'react';export function UserProfile({ userId }) {const [user, setUser] = useState(null);const [error, setError] = useState(null);useEffect(() => {const controller = new AbortController();async function loadData() {try {const res = await fetch(`/api/users/${userId}`, { signal: controller.signal });if (!res.ok) throw new Error(`HTTP error: ${res.status}`);const data = await res.json();setUser(data);} catch (err) {if (err.name !== 'AbortError') {setError(err.message);}}}loadData();return () => controller.abort();}, [userId]);if (error) return <p role="alert">Error: {error}</p>;if (!user) return <p>Loading...</p>;return <h1>{user.name}</h1>;}
react
Erklärung
1
const controller = new AbortController();
Erstellt einen neuen Controller, um ein Abbruchsignal für Netzwerkanfragen zu generieren.
2
const res = await fetch(`/api/users/${userId}`, { signal: controller.signal });
Verknüpft das Abbruchsignal direkt mit den Fetch-Konfigurationsoptionen.
3
if (err.name !== 'AbortError') {
Filtert DOMException-Abbruchfehler heraus, damit beim Unmounten der Komponente keine Fehlermeldung angezeigt wird.
4
return () => controller.abort();
Wird bei Änderung der Abhängigkeit oder beim Unmounten ausgeführt, um die laufende Anfrage sofort abzubrechen.