javascript / intermediate
Snippet
Abbrechen veralteter asynchroner Fetch-Anfragen in Vue-Watchern
Schnelle Zustandsänderungen in reaktiven Watchern können Race Conditions hervorrufen, bei denen veraltete asynchrone Antworten neuere Suchergebnisse überschreiben. Die Übergabe des AbortController-Signals an fetch und dessen Aufruf im onCleanup-Callback bricht laufende Anfragen ab, während das Filtern von AbortError fehlerhafte Fehlermeldungen verhindert.
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
import { ref, watch } from 'vue';export function useLiveSearch(queryRef: ReturnType<typeof ref<string>>) {const results = ref<string[]>([]);const isSearching = ref(false);const searchError = ref<Error | null>(null);watch(queryRef, async (query, _, onCleanup) => {if (!query.trim()) {results.value = [];return;}const controller = new AbortController();onCleanup(() => controller.abort());isSearching.value = true;searchError.value = null;try {const response = await fetch(`/api/search?q=${encodeURIComponent(query)}`, {signal: controller.signal});if (!response.ok) throw new Error(`HTTP Error: ${response.status}`);results.value = await response.json();} catch (err: unknown) {if (err instanceof DOMException && err.name === 'AbortError') return;searchError.value = err instanceof Error ? err : new Error(String(err));} finally {if (!controller.signal.aborted) isSearching.value = false;}});return { results, isSearching, searchError };}
vue
Erklärung
1
watch(queryRef, async (query, _, onCleanup) => {
Erhält den onCleanup-Registrierungshook der Vue-Watch-API zusammen mit dem aktualisierten Abfrage-String.
2
onCleanup(() => controller.abort());
Registriert einen Abbruch-Hook, der bei jeder erneuten Watcher-Ausführung oder Demontage aufgerufen wird.
3
signal: controller.signal
Bindet die Fetch-Operation direkt an den Lebenszyklus des Abbruchsignals.
4
if (err instanceof DOMException && err.name === 'AbortError') return;
Fängt erwartete Abbruchfehler ab und ignoriert sie, um Fehlalarme in der Benutzeroberfläche zu vermeiden.