From 88a6aa0d89d445f5018cf18850de86fa22365e00 Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Thu, 12 Mar 2026 11:14:39 +0100 Subject: [PATCH] fix state.eager/effect.pending --- .../svelte/src/internal/client/reactivity/batch.js | 11 ++++++++--- .../samples/async-state-eager/_config.js | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index 7bed61eb7b..1e4a3b36fe 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -179,10 +179,12 @@ export class Batch { is_fork = false; + eager = false; + #decrement_queued = false; #is_deferred() { - return this.is_fork || this.#blocking_pending > 0; + return !this.eager && (this.is_fork || this.#blocking_pending > 0); } /** @returns {boolean} */ @@ -260,8 +262,6 @@ export class Batch { */ var updates = (legacy_updates = []); - if (this.id === 5) debugger; - for (const root of roots) { this.#traverse(root, effects, render_effects); } @@ -692,6 +692,9 @@ export class Batch { // from = Batch.find(from); to = Batch.find(to); if (from === to) return; + if (from.is_fork || to.is_fork || (from.eager && !to.eager) || (to.eager && !from.eager)) { + return from; + } for (const [source, value] of from.previous) { if (!to.previous.has(source)) { @@ -1120,6 +1123,8 @@ let eager_versions = []; function eager_flush() { try { flushSync(() => { + var batch = Batch.ensure(); + batch.eager = true; for (const version of eager_versions) { update(version); } diff --git a/packages/svelte/tests/runtime-runes/samples/async-state-eager/_config.js b/packages/svelte/tests/runtime-runes/samples/async-state-eager/_config.js index f84228ec14..4031086e41 100644 --- a/packages/svelte/tests/runtime-runes/samples/async-state-eager/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/async-state-eager/_config.js @@ -23,11 +23,11 @@ export default test({ shift.click(); await tick(); - assert.htmlEqual(target.innerHTML, `

1

`); + assert.htmlEqual(target.innerHTML, `

0

`); shift.click(); await tick(); - assert.htmlEqual(target.innerHTML, `

2

`); + assert.htmlEqual(target.innerHTML, `

0

`); shift.click(); await tick();