javascript / expert
Snippet
AbortSignal-Integration für abbrechbare asynchrone Nebeneffekte in React Hooks
Dieser React-Hook auf Expertenniveau verwaltet asynchrone Lebenszyklus-Ereignisse sicher mittels `AbortController` und `AbortSignal`. Er verhindert Race Conditions und Speicherlecks durch explizites Abbrechen laufender HTTP-Anfragen bei Komponenten-Unmount oder Abhängigkeitsänderungen, während harmlose `AbortError`-Instanzen gefiltert 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
31
import { useState, useEffect, useRef } from 'react';export function useCancelableFetch(url) {const [data, setData] = useState(null);const [error, setError] = useState(null);const abortControllerRef = useRef(null);useEffect(() => {abortControllerRef.current?.abort('Component unmounted or URL changed');const controller = new AbortController();abortControllerRef.current = controller;async function executeFetch() {try {const response = await fetch(url, { signal: controller.signal });if (!response.ok) throw new Error(`HTTP Error ${response.status}`);const json = await response.json();setData(json);} catch (err) {if (err.name !== 'AbortError') {setError(err);}}}executeFetch();return () => controller.abort('Cleanup triggered');}, [url]);return { data, error };}
react
Erklärung
1
const controller = new AbortController();
Erzeugt einen nativen JS AbortController zur Signalisierung von Abbrüchen an Fetch-Anfragen.
2
const response = await fetch(url, { signal: controller.signal });
Verknüpft das AbortSignal des Controllers direkt mit den Optionen der Fetch-Anfrage.
3
if (err.name !== 'AbortError') { setError(err); }
Unterscheidet betriebsbedingte Laufzeitfehler von gewollten Anfragen-Abbrüchen, um fehlerhafte Zustandskonflikte zu vermeiden.
4
return () => controller.abort('Cleanup triggered');
Löst das Abbrechsignal im Effect-Teardown aus, wenn Abhängigkeiten aktualisiert werden oder die Komponente unmountet.