{"record":{"id":"36cbae547f736364","repo":"sveltejs/svelte","slug":"get-abort-signal-outside-reaction","errorCode":"get_abort_signal_outside_reaction","errorMessage":"get_abort_signal_outside_reaction\n`getAbortSignal()` can only be called inside an effect or derived\nhttps://svelte.dev/e/get_abort_signal_outside_reaction","messagePattern":"get_abort_signal_outside_reaction\n`getAbortSignal\\(\\)` can only be called inside an effect or derived\nhttps://svelte\\.dev/e/get_abort_signal_outside_reaction","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/svelte/src/internal/client/errors.js","lineNumber":311,"sourceCode":"\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/fork_timing`);\n\t}\n}\n\n/**\n * `getAbortSignal()` can only be called inside an effect or derived\n * @returns {never}\n */\nexport function get_abort_signal_outside_reaction() {\n\tif (DEV) {\n\t\tconst error = new Error(`get_abort_signal_outside_reaction\\n\\`getAbortSignal()\\` can only be called inside an effect or derived\\nhttps://svelte.dev/e/get_abort_signal_outside_reaction`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/get_abort_signal_outside_reaction`);\n\t}\n}\n\n/**\n * Expected to find a hydratable with key `%key%` during hydration, but did not.\n * @param {string} key\n * @returns {never}\n */\nexport function hydratable_missing_but_required(key) {\n\tif (DEV) {\n\t\tconst error = new Error(`hydratable_missing_but_required\\nExpected to find a hydratable with key \\`${key}\\` during hydration, but did not.\\nhttps://svelte.dev/e/hydratable_missing_but_required`);\n\n\t\terror.name = 'Svelte error';\n\n\t\tthrow error;\n\t} else {\n\t\tthrow new Error(`https://svelte.dev/e/hydratable_missing_but_required`);\n\t}","sourceCodeStart":293,"sourceCodeEnd":329,"githubUrl":"https://github.com/sveltejs/svelte/blob/20b341f10048cf1016a2028ac7eee5595cfef6a5/packages/svelte/src/internal/client/errors.js#L293-L329","documentation":"Thrown at index-client.js:71 inside getAbortSignal() when active_reaction is null. getAbortSignal returns an AbortController signal tied to the current effect/derived lifecycle so async work is cancelled on re-run or teardown; without an active reaction there is no lifecycle to bind it to.","triggerScenarios":"Calling getAbortSignal() in module scope, in a plain function not invoked from an effect/derived, in an event handler, or after the component finished initialising. The guard at index-client.js:70-72 checks active_reaction===null.","commonSituations":"Calling getAbortSignal() inside a plain async utility imported from a .js file; using it in an onMount-style function that runs outside a derived; refactoring data fetching out of a $derived into a plain function.","solutions":["Call getAbortSignal() only from within a $derived (e.g. `const data = $derived(await getData(id))`) or a $effect.","Pass the signal down from the effect/derived rather than calling getAbortSignal in a leaf utility.","If you need cancellation outside reactivity, construct your own AbortController and manage its lifecycle."],"exampleFix":"// before\nasync function loadData(id) {\n  const res = await fetch(`/api/${id}`, { signal: getAbortSignal() });\n  return res.json();\n}\n// called from a plain event handler — no active reaction\n\n// after — call from a $derived so a reaction is active\nconst data = $derived(loadData(id));\n// loadData now runs inside the derived, getAbortSignal has a reaction","handlingStrategy":"validation","validationCode":"// Only call getAbortSignal() from inside a $derived or $effect.\n// For utilities, accept an explicit signal argument instead:\nasync function loadData(id, signal) {\n  const res = await fetch(`/api/${id}`, { signal });\n  return res.json();\n}\n// caller: const data = $derived(loadData(id, getAbortSignal()));","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Call getAbortSignal() only from within a $derived or $effect body.","Pass signals explicitly to leaf utilities rather than calling the rune there.","Outside reactivity, manage your own AbortController."],"tags":["svelte","runes","abort-signal","async","effects","derived"],"backgroundTag":null,"analyzedSha":"20b341f10048cf1016a2028ac7eee5595cfef6a5","analyzedAt":"2026-08-12T23:37:30.399Z","schemaVersion":2},"datasetVersion":"2026-08-13T04:17:16.726Z"}