From 0ffd1fcb4493c4004c5226bc38abd687959dc083 Mon Sep 17 00:00:00 2001 From: paoloricciuti Date: Fri, 18 Jul 2025 09:19:57 +0200 Subject: [PATCH] fix: keep effect in the graph if it has an abort controller --- .changeset/four-kings-drum.md | 5 +++++ .../svelte/src/internal/client/reactivity/batch.js | 4 +++- .../dependencyless-abort-signal/Component.svelte | 8 ++++++++ .../samples/dependencyless-abort-signal/_config.js | 12 ++++++++++++ .../samples/dependencyless-abort-signal/main.svelte | 10 ++++++++++ 5 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 .changeset/four-kings-drum.md create mode 100644 packages/svelte/tests/runtime-runes/samples/dependencyless-abort-signal/Component.svelte create mode 100644 packages/svelte/tests/runtime-runes/samples/dependencyless-abort-signal/_config.js create mode 100644 packages/svelte/tests/runtime-runes/samples/dependencyless-abort-signal/main.svelte diff --git a/.changeset/four-kings-drum.md b/.changeset/four-kings-drum.md new file mode 100644 index 0000000000..8c7343145e --- /dev/null +++ b/.changeset/four-kings-drum.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: keep effect in the graph if it has an abort controller diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index cdce971b18..ed82af94ed 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -532,7 +532,9 @@ function flush_queued_effects(effects) { // here (rather than in `update_effect`) allows us to skip the work for // immediate effects. if (effect.deps === null && effect.first === null && effect.nodes_start === null) { - if (effect.teardown === null) { + // if there's no teardown or abort controller we completely unlink + // the effect from the graph + if (effect.teardown === null && effect.ac === null) { // remove this effect from the graph unlink_effect(effect); } else { diff --git a/packages/svelte/tests/runtime-runes/samples/dependencyless-abort-signal/Component.svelte b/packages/svelte/tests/runtime-runes/samples/dependencyless-abort-signal/Component.svelte new file mode 100644 index 0000000000..b184e0e9b3 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/dependencyless-abort-signal/Component.svelte @@ -0,0 +1,8 @@ + \ No newline at end of file diff --git a/packages/svelte/tests/runtime-runes/samples/dependencyless-abort-signal/_config.js b/packages/svelte/tests/runtime-runes/samples/dependencyless-abort-signal/_config.js new file mode 100644 index 0000000000..6eb4b06712 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/dependencyless-abort-signal/_config.js @@ -0,0 +1,12 @@ +import { flushSync } from 'svelte'; +import { test } from '../../test'; + +export default test({ + async test({ assert, target, logs }) { + const btn = target.querySelector('button'); + flushSync(() => { + btn?.click(); + }); + assert.deepEqual(logs, ['abort']); + } +}); diff --git a/packages/svelte/tests/runtime-runes/samples/dependencyless-abort-signal/main.svelte b/packages/svelte/tests/runtime-runes/samples/dependencyless-abort-signal/main.svelte new file mode 100644 index 0000000000..99ea3fabb4 --- /dev/null +++ b/packages/svelte/tests/runtime-runes/samples/dependencyless-abort-signal/main.svelte @@ -0,0 +1,10 @@ + + + +{#if show} + +{/if}