From 871e590c594c2c4ec42ad9fa160bff7f3e445784 Mon Sep 17 00:00:00 2001
From: Simon H <5968653+dummdidumm@users.noreply.github.com>
Date: Tue, 26 May 2026 18:14:35 +0200
Subject: [PATCH] fix: settle discarded batch (#18290)
Without this the promise would never resolve
---
.changeset/neat-groups-grin.md | 5 +++
.../src/internal/client/reactivity/batch.js | 1 +
.../samples/async-settled-discard/_config.js | 37 +++++++++++++++++++
.../samples/async-settled-discard/main.svelte | 22 +++++++++++
4 files changed, 65 insertions(+)
create mode 100644 .changeset/neat-groups-grin.md
create mode 100644 packages/svelte/tests/runtime-runes/samples/async-settled-discard/_config.js
create mode 100644 packages/svelte/tests/runtime-runes/samples/async-settled-discard/main.svelte
diff --git a/.changeset/neat-groups-grin.md b/.changeset/neat-groups-grin.md
new file mode 100644
index 0000000000..1d615216f0
--- /dev/null
+++ b/.changeset/neat-groups-grin.md
@@ -0,0 +1,5 @@
+---
+'svelte': patch
+---
+
+fix: settle discarded batch
diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js
index 82c97cf95c..08e8cf24c4 100644
--- a/packages/svelte/src/internal/client/reactivity/batch.js
+++ b/packages/svelte/src/internal/client/reactivity/batch.js
@@ -633,6 +633,7 @@ export class Batch {
this.#fork_commit_callbacks.clear();
this.#unlink();
+ this.#deferred?.resolve();
}
/**
diff --git a/packages/svelte/tests/runtime-runes/samples/async-settled-discard/_config.js b/packages/svelte/tests/runtime-runes/samples/async-settled-discard/_config.js
new file mode 100644
index 0000000000..29ed72d90a
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/async-settled-discard/_config.js
@@ -0,0 +1,37 @@
+import { tick } from 'svelte';
+import { test } from '../../test';
+
+export default test({
+ async test({ assert, target, logs }) {
+ await tick();
+ const [increment, pop] = target.querySelectorAll('button');
+
+ increment.click();
+ await tick();
+ increment.click();
+ await tick();
+ pop.click();
+ await tick();
+ assert.deepEqual(logs, ['settled 2', 'settled 2']);
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+ 2
+
+
+ `
+ );
+
+ pop.click();
+ await tick();
+ assert.deepEqual(logs, ['settled 2', 'settled 2']);
+ assert.htmlEqual(
+ target.innerHTML,
+ `
+ 2
+
+
+ `
+ );
+ }
+});
diff --git a/packages/svelte/tests/runtime-runes/samples/async-settled-discard/main.svelte b/packages/svelte/tests/runtime-runes/samples/async-settled-discard/main.svelte
new file mode 100644
index 0000000000..c3675f8add
--- /dev/null
+++ b/packages/svelte/tests/runtime-runes/samples/async-settled-discard/main.svelte
@@ -0,0 +1,22 @@
+
+
+{await push(count)}
+
+