From 1ab675f71720dac6b7958e3f9c8bf16e3622e17e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 7 Oct 2025 19:02:37 -0400 Subject: [PATCH 1/3] fix: flush batches whenever an async value resolves --- .changeset/metal-parents-train.md | 5 +++++ .../src/internal/client/reactivity/batch.js | 22 ++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) create mode 100644 .changeset/metal-parents-train.md diff --git a/.changeset/metal-parents-train.md b/.changeset/metal-parents-train.md new file mode 100644 index 000000000000..57c99453c339 --- /dev/null +++ b/.changeset/metal-parents-train.md @@ -0,0 +1,5 @@ +--- +'svelte': patch +--- + +fix: flush batches whenever an async value resolves diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index fb704edb1325..2b1130dd0bd9 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -375,21 +375,17 @@ export class Batch { decrement() { this.#pending -= 1; - if (this.#pending === 0) { - for (const e of this.#dirty_effects) { - set_signal_status(e, DIRTY); - schedule_effect(e); - } - - for (const e of this.#maybe_dirty_effects) { - set_signal_status(e, MAYBE_DIRTY); - schedule_effect(e); - } + for (const e of this.#dirty_effects) { + set_signal_status(e, DIRTY); + schedule_effect(e); + } - this.flush(); - } else { - this.deactivate(); + for (const e of this.#maybe_dirty_effects) { + set_signal_status(e, MAYBE_DIRTY); + schedule_effect(e); } + + this.flush(); } /** @param {() => void} fn */ From 8b875630d89f8a97d0fe0576a19a5d6971eb5bf8 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 7 Oct 2025 19:07:21 -0400 Subject: [PATCH 2/3] move some code around --- .../src/internal/client/reactivity/batch.js | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index 2b1130dd0bd9..102d0670b664 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -178,6 +178,8 @@ export class Batch { flush_queued_effects(render_effects); flush_queued_effects(effects); + previous_batch = null; + this.#deferred?.resolve(); } else { this.#defer_effects(this.#render_effects); @@ -280,17 +282,6 @@ export class Batch { deactivate() { current_batch = null; - previous_batch = null; - - for (const update of effect_pending_updates) { - effect_pending_updates.delete(update); - update(); - - if (current_batch !== null) { - // only do one at a time - break; - } - } } flush() { @@ -307,6 +298,16 @@ export class Batch { } this.deactivate(); + + for (const update of effect_pending_updates) { + effect_pending_updates.delete(update); + update(); + + if (current_batch !== null) { + // only do one at a time + break; + } + } } /** From ec721bba62936efda7beba374235f17c6b2f1cce Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 7 Oct 2025 19:12:07 -0400 Subject: [PATCH 3/3] unnecessary --- packages/svelte/src/internal/client/reactivity/async.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/async.js b/packages/svelte/src/internal/client/reactivity/async.js index 4d572281b76a..45c78ff926b9 100644 --- a/packages/svelte/src/internal/client/reactivity/async.js +++ b/packages/svelte/src/internal/client/reactivity/async.js @@ -52,8 +52,6 @@ export function flatten(sync, async, fn) { Promise.all(async.map((expression) => async_derived(expression))) .then((result) => { - batch?.activate(); - restore(); try {