diff --git a/packages/svelte/src/internal/client/reactivity/async.js b/packages/svelte/src/internal/client/reactivity/async.js index c9ffe64734..0e332d2ed7 100644 --- a/packages/svelte/src/internal/client/reactivity/async.js +++ b/packages/svelte/src/internal/client/reactivity/async.js @@ -57,6 +57,7 @@ export function flatten(sync, async, fn) { } batch?.deactivate(); + unset_context(); }) .catch((error) => { boundary.error(error); @@ -81,10 +82,6 @@ function capture() { if (DEV) { set_from_async_derived(null); } - - // prevent the active effect from outstaying its welcome - // TODO this feels brittle - queue_micro_task(unset_context); }; } @@ -123,7 +120,7 @@ export async function track_reactivity_loss(promise) { }; } -function unset_context() { +export function unset_context() { set_active_effect(null); set_active_reaction(null); set_component_context(null); diff --git a/packages/svelte/src/internal/client/reactivity/batch.js b/packages/svelte/src/internal/client/reactivity/batch.js index ee14e19b07..1126946ce9 100644 --- a/packages/svelte/src/internal/client/reactivity/batch.js +++ b/packages/svelte/src/internal/client/reactivity/batch.js @@ -30,6 +30,7 @@ import { DEV } from 'esm-env'; import { invoke_error_boundary } from '../error-handling.js'; import { old_values } from './sources.js'; import { unlink_effect } from './effects.js'; +import { unset_context } from './async.js'; /** @type {Set} */ const batches = new Set(); @@ -589,6 +590,8 @@ export function suspend() { return function unsuspend() { boundary.update_pending_count(-1); if (!pending) batch.decrement(); + + unset_context(); }; } diff --git a/packages/svelte/src/internal/client/reactivity/deriveds.js b/packages/svelte/src/internal/client/reactivity/deriveds.js index f5957690e2..fa6a9e02a1 100644 --- a/packages/svelte/src/internal/client/reactivity/deriveds.js +++ b/packages/svelte/src/internal/client/reactivity/deriveds.js @@ -34,6 +34,7 @@ import { Boundary } from '../dom/blocks/boundary.js'; import { component_context } from '../context.js'; import { UNINITIALIZED } from '../../../constants.js'; import { batch_deriveds, current_batch } from './batch.js'; +import { unset_context } from './async.js'; /** @type {Effect | null} */ export let current_async_effect = null; @@ -179,6 +180,8 @@ export function async_derived(fn, location) { boundary.update_pending_count(-1); if (!pending) batch.decrement(); } + + unset_context(); }; promise.then(handler, (e) => handler(null, e || 'unknown'));