javascript / intermediate
Snippet
Abbrechen veralteter asynchroner Anfragen mit AbortController in Vue-Watchern
Wenn in Vue auf schnelle Sucheingaben reagiert wird, können frühere Netzwerkanfragen nach neueren abgeschlossen werden, was zu veralteten Daten oder Race Conditions führt. Durch die Verwendung eines nativen AbortController können laufende HTTP-Anfragen vor dem Auslösen eines neuen Abrufs abgebrochen werden. Durch das Filtern von AbortError im catch-Block werden harmlose Abbruchsignale ignoriert, während echte Laufzeitfehler erhalten bleiben.
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
36
37
38
39
40
import { ref, watch } from 'vue';export function useUserSearch(queryRef) {const results = ref([]);const isLoading = ref(false);const error = ref(null);let abortController = null;watch(queryRef, async (newQuery) => {if (abortController) {abortController.abort();}if (!newQuery.trim()) {results.value = [];return;}abortController = new AbortController();isLoading.value = true;error.value = null;try {const res = await fetch(`/api/search?q=${encodeURIComponent(newQuery)}`, {signal: abortController.signal});if (!res.ok) throw new Error(`HTTP status: ${res.status}`);results.value = await res.json();} catch (err) {if (err.name !== 'AbortError') {error.value = err.message;}} finally {if (!abortController.signal.aborted) {isLoading.value = false;}}}, { immediate: true });return { results, isLoading, error };}
vue
Erklärung
1
if (abortController) { abortController.abort(); }
Bricht jede derzeit aktive Fetch-Anfrage ab, bevor eine neue Suche gestartet wird.
2
signal: abortController.signal
Verbindet die Fetch-Anfrage mit dem Abbruchsignal des AbortControllers.
3
if (err.name !== 'AbortError') {
Stellt sicher, dass gewollte Anfragenabbrüche nicht als echte Anwendungsfehler behandelt werden.