diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index 3da142f027..a8849bf1c9 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -1,6 +1,6 @@ /** @import { Effect, Source } from '#client' */ import { DIRTY } from '#client/constants'; -import { schedule_effect, set_signal_status } from '../runtime.js'; +import { schedule_effect, set_signal_status, update_effect } from '../runtime.js'; import { raf } from '../timing.js'; import { internal_set, mark_reactions, pending } from './sources.js'; @@ -35,6 +35,9 @@ export class Batch { #pending = 0; + /** @type {Effect[]} */ + async_effects = []; + /** @type {Effect[]} */ effects = []; @@ -73,6 +76,12 @@ export class Batch { for (const [source, value] of current_values) { source.v = value; } + + for (const effect of this.async_effects) { + update_effect(effect); + } + + this.async_effects = []; }; } diff --git a/packages/svelte/src/internal/client/runtime.js b/packages/svelte/src/internal/client/runtime.js index bd6b0d9a80..599977408e 100644 --- a/packages/svelte/src/internal/client/runtime.js +++ b/packages/svelte/src/internal/client/runtime.js @@ -697,9 +697,6 @@ function flush_queued_root_effects() { var revert = batch.apply(); - /** @type {Effect[]} */ - var async_effects = []; - /** @type {Effect[]} */ var render_effects = []; @@ -711,10 +708,10 @@ function flush_queued_root_effects() { queued_root_effects = []; for (const root of root_effects) { - process_effects(batch, root, async_effects, render_effects, effects); + process_effects(batch, root, render_effects, effects); } - if (async_effects.length === 0 && batch.settled()) { + if (batch.async_effects.length === 0 && batch.settled()) { batch.commit(); flush_queued_effects(render_effects); flush_queued_effects(effects); @@ -734,10 +731,6 @@ function flush_queued_root_effects() { revert(); - for (const effect of async_effects) { - update_effect(effect); - } - old_values.clear(); } } finally { @@ -836,11 +829,10 @@ export function schedule_effect(signal) { * * @param {Batch} batch * @param {Effect} root - * @param {Effect[]} async_effects * @param {Effect[]} render_effects * @param {Effect[]} effects */ -function process_effects(batch, root, async_effects, render_effects, effects) { +function process_effects(batch, root, render_effects, effects) { root.f ^= CLEAN; var effect = root.first; @@ -855,7 +847,7 @@ function process_effects(batch, root, async_effects, render_effects, effects) { if (!skip && effect.fn !== null) { if ((flags & EFFECT_ASYNC) !== 0) { if (check_dirtiness(effect)) { - async_effects.push(effect); + batch.async_effects.push(effect); } } else if ((flags & BLOCK_EFFECT) !== 0) { try {