diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index ca6d9f8e51..435c621118 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -1205,14 +1205,18 @@ export function eager(fn) { return; } - // the second time this effect runs, it's to schedule a - // `version` update. since this will recreate the effect, - // we don't need to evaluate the expression here - if (eager_versions.length === 0) { - queue_micro_task(eager_flush); - } + if (!current_batch?.is_fork) { + // the second time this effect runs, it's to schedule a + // `version` update. since this will recreate the effect, + // we don't need to evaluate the expression here + if (eager_versions.length === 0) { + queue_micro_task(eager_flush); + } - eager_versions.push(version); + eager_versions.push(version); + } else { + fn(); + } }); initial = false; @@ -1314,14 +1318,8 @@ export function fork(fn) { } for (var [value, wv] of batch.wvs) { - if (wv > value.wv) { - value.v = batch.current.get(value); - value.wv = increment_write_version(); - - if ((value.f & DERIVED) !== 0) { - /** @type {Derived} */ (value).cv = value.wv; - } - } + value.v = batch.current.get(value); + value.wv = wv; } // trigger any `$state.eager(...)` expressions with the new state. @@ -1381,7 +1379,10 @@ export function get_cv(reaction) { export function set_cv(reaction, cv = write_version) { current_batch?.cvs.set(reaction, cv); batch_cvs?.set(reaction, cv); - reaction.cv = cv; + + if (!current_batch?.is_fork) { + reaction.cv = cv; + } } /** diff --git a/packages/svelte/src/internal/client/reactivity/deriveds.js b/packages/svelte/src/internal/client/reactivity/deriveds.js index 5565c7384d..3d7acb3fc7 100644 --- a/packages/svelte/src/internal/client/reactivity/deriveds.js +++ b/packages/svelte/src/internal/client/reactivity/deriveds.js @@ -39,7 +39,7 @@ import { get_error } from '../../shared/dev.js'; import { async_mode_flag, tracing_mode_flag } from '../../flags/index.js'; import { component_context } from '../context.js'; import { UNINITIALIZED } from '../../../constants.js'; -import { batch_values, batch_wvs, current_batch, set_cv } from './batch.js'; +import { batch_values, batch_wvs, current_batch, get_wv, set_cv } from './batch.js'; import { increment_pending, unset_context } from './async.js'; import { deferred, includes, noop } from '../../shared/utils.js'; @@ -388,7 +388,7 @@ export function execute_derived(derived) { export function update_derived(derived) { var value = execute_derived(derived); - set_cv(derived); + set_cv(derived, derived.deps === null ? Infinity : Math.max(...derived.deps.map(get_wv))); if (!derived.equals(value)) { batch_wvs?.set(derived, write_version);