javascript / intermediate
Snippet
Fehlerbehebung mit exponentiellem Backoff in asynchronen React-Aktionen
Netzwerkanfragen können auf vorübergehende Netzwerkprobleme oder Ratenbegrenzungen stoßen. Anstatt direkt beim ersten Fehler abzubrechen, verwendet dieses Muster zur Fehlerbehandlung rekursiven exponentiellen Backoff, um die Anfrage mit verdoppelter Wartezeit zu wiederholen, bevor der Fehler im React-Zustand gespeichert wird.
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
33
34
35
import { useState } from 'react';async function fetchWithRetry(url, retries = 3, delay = 500) {try {const res = await fetch(url);if (!res.ok) throw new Error(`HTTP Error: ${res.status}`);return await res.json();} catch (err) {if (retries <= 0) throw err;await new Promise((resolve) => setTimeout(resolve, delay));return fetchWithRetry(url, retries - 1, delay * 2);}}export function DataFetcher({ endpoint }) {const [status, setStatus] = useState({ data: null, error: null, loading: false });const handleLoad = async () => {setStatus({ data: null, error: null, loading: true });try {const result = await fetchWithRetry(endpoint);setStatus({ data: result, error: null, loading: false });} catch (err) {setStatus({ data: null, error: err.message, loading: false });}};return (<div><button onClick={handleLoad} disabled={status.loading}>Load Data</button>{status.error && <p role="alert">Failed: {status.error}</p>}{status.data && <pre>{JSON.stringify(status.data, null, 2)}</pre>}</div>);}
react
Erklärung
1
if (retries <= 0) throw err;
Beendet die Rekursion und wirft den letzten Fehler weiter, sobald alle Wiederholungsversuche aufgebraucht sind.
2
await new Promise((resolve) => setTimeout(resolve, delay));
Pausiert die Ausführung asynchron für die angegebene Zeitspanne vor dem nächsten Versuch.
3
return fetchWithRetry(url, retries - 1, delay * 2);
Ruft die Fetch-Funktion rekursiv mit einem verbleibenden Versuch weniger und verdoppelter Wartezeit auf.