From 5518e98c3185a2d2ef8575f6c26644e97cb27f6e Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 20 Apr 2025 19:58:26 -0400 Subject: [PATCH] WIP --- .../svelte/src/internal/client/reactivity/batch.js | 13 +++++++++++-- packages/svelte/src/internal/client/runtime.js | 12 ++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index 4d5595f677..863259c3c4 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -1,7 +1,6 @@ /** @import { Effect, Source } from '#client' */ import { DIRTY } from '#client/constants'; -import { noop } from '../../shared/utils.js'; -import { flushSync } from '../runtime.js'; +import { schedule_effect, set_signal_status } from '../runtime.js'; import { raf } from '../timing.js'; import { internal_set, mark_reactions, pending } from './sources.js'; @@ -31,6 +30,9 @@ export class Batch { /** @type {Map} */ #current = new Map(); + /** @type {Set} */ + effects = new Set(); + /** @type {Set} */ skipped_effects = new Set(); @@ -49,6 +51,13 @@ export class Batch { source.v = current; } + for (const e of this.effects) { + if (e.fn) { + set_signal_status(e, DIRTY); + schedule_effect(e); + } + } + for (const batch of batches) { if (batch === this) continue; diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 313a8b9ed8..94c583cc8b 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -718,6 +718,18 @@ function flush_queued_root_effects() { batch.commit(); flush_queued_effects(render_effects); flush_queued_effects(effects); + } else { + // store the effects on the batch so that they run next time, + // even if they don't get re-dirtied + for (const e of render_effects) { + batch.effects.add(e); + set_signal_status(e, CLEAN); + } + + for (const e of effects) { + batch.effects.add(e); + set_signal_status(e, CLEAN); + } } revert();