javascript / expert
Snippet
Abbruch asynchroner Aufgaben über benutzerdefinierte Vue Effect Scope Disposables
Vues effectScope kapselt reaktive Abonnements und Seiteneffekte. Durch das Verknüpfen eines AbortControllers innerhalb von effectScope und das Registrieren eines Abbruchs via onScopeDispose werden asynchrone Netzwerk-Operationen beim Beenden des Scopes sauber abgebrochen.
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
import { ref, effectScope, onScopeDispose } from 'vue';export function useCancellableFetch(urlProvider) {const data = ref(null);const error = ref(null);const scope = effectScope();scope.run(() => {const controller = new AbortController();onScopeDispose(() => {controller.abort('Scope disposed');});const execute = async () => {try {const response = await fetch(urlProvider(), { signal: controller.signal });if (!response.ok) throw new Error(`HTTP ${response.status}`);data.value = await response.json();} catch (err) {if (err.name !== 'AbortError') error.value = err;}};execute();});return { data, error, stop: () => scope.stop() };}
vue
Erklärung
1
const scope = effectScope();
Erzeugt einen isolierten reaktiven Effect-Scope-Container zur Erfassung entsorgbarer Effekte.
2
onScopeDispose(() => { controller.abort('Scope disposed'); });
Registriert einen Bereinigungs-Hook, der automatisch ausgeführt wird, wenn scope.stop() aufgerufen wird.
3
if (err.name !== 'AbortError') error.value = err;
Filtert beabsichtigte Abbruchsignale aus den eigentlichen Laufzeitfehlern heraus.