From 903eedb861aad4500dd817470c2df2f84dee6f5a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 10 Mar 2026 20:01:38 -0400 Subject: [PATCH] progress i think? --- .../src/internal/client/reactivity/batch.js | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index 0d66fae02a..d29eae450c 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -166,6 +166,9 @@ export class Batch { #decrement_queued = false; + /** @type {Set} */ + #blockers = new Set(); + #is_deferred() { return this.is_fork || this.#blocking_pending > 0; } @@ -241,7 +244,7 @@ export class Batch { collected_effects = null; legacy_updates = null; - if (this.#is_deferred()) { + if (this.#is_deferred() || this.#blockers.size > 0) { this.#defer_effects(render_effects); this.#defer_effects(effects); @@ -509,7 +512,10 @@ export class Batch { this.#pending -= 1; if (blocking) this.#blocking_pending -= 1; - if (this.#decrement_queued || skip) return; + if (this.#decrement_queued || skip) { + return; + } + this.#decrement_queued = true; queue_micro_task(() => { @@ -556,6 +562,8 @@ export class Batch { } apply() { + this.#blockers.clear(); + if (!async_mode_flag || (!this.is_fork && batches.size === 1)) { batch_values = null; return; @@ -575,18 +583,19 @@ export class Batch { continue; } - var coincides = false; + var intersects = false; + var differs = false; if (is_earlier) { for (const source of batch.current.keys()) { - if (this.current.has(source)) { - coincides = true; - break; - } + intersects ||= this.current.has(source); + differs ||= !this.current.has(source); } } - if (!coincides) { + if (intersects && differs) { + this.#blockers.add(batch); + } else { for (const [source, previous] of batch.previous) { if (!batch_values.has(source)) { batch_values.set(source, previous);