diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index 6477e2942a4f..bf133be6aab4 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -45,6 +45,7 @@ import { handle_error, invoke_error_boundary } from './error-handling.js'; import { UNINITIALIZED } from '../../constants.js'; let is_flushing = false; +let is_flushing_root_effects = false; /** @type {Effect | null} */ let last_scheduled_effect = null; @@ -548,6 +549,7 @@ function flush_queued_root_effects() { try { var flush_count = 0; is_updating_effect = true; + is_flushing_root_effects = true; while (queued_root_effects.length > 0) { if (flush_count++ > 1000) { @@ -568,6 +570,7 @@ function flush_queued_root_effects() { } finally { is_flushing = false; is_updating_effect = was_updating_effect; + is_flushing_root_effects = false; last_scheduled_effect = null; if (DEV) { @@ -638,6 +641,10 @@ export function schedule_effect(signal) { effect = effect.parent; var flags = effect.f; + if (effect === active_effect && (flags & BLOCK_EFFECT) !== 0 && is_flushing_root_effects) { + return; + } + if ((flags & (ROOT_EFFECT | BRANCH_EFFECT)) !== 0) { if ((flags & CLEAN) === 0) return; effect.f ^= CLEAN;