From c3ad8c48f4f0e6e7d33812da7d7a04a5ceff5560 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 5 Jun 2025 17:23:33 -0400 Subject: [PATCH] WIP --- packages/svelte/src/internal/client/reactivity/deriveds.js | 6 ++++++ packages/svelte/src/internal/client/reactivity/effects.js | 6 +++--- .../tests/runtime-runes/samples/async-error/_config.js | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/svelte/src/internal/client/reactivity/deriveds.js b/packages/svelte/src/internal/client/reactivity/deriveds.js index 3f21da8e54..fab6e691ff 100644 --- a/packages/svelte/src/internal/client/reactivity/deriveds.js +++ b/packages/svelte/src/internal/client/reactivity/deriveds.js @@ -160,9 +160,15 @@ export function async_derived(fn, location) { if (error) { if (error !== STALE_REACTION) { signal.f |= ASYNC_ERROR; + + // @ts-expect-error the error is the wrong type, but we don't care internal_set(signal, error); } } else { + if ((signal.f & ASYNC_ERROR) !== 0) { + signal.f ^= ASYNC_ERROR; + } + internal_set(signal, value); if (DEV && location !== undefined) { diff --git a/packages/svelte/src/internal/client/reactivity/effects.js b/packages/svelte/src/internal/client/reactivity/effects.js index 5a5b4d69f5..f434035ffa 100644 --- a/packages/svelte/src/internal/client/reactivity/effects.js +++ b/packages/svelte/src/internal/client/reactivity/effects.js @@ -339,7 +339,7 @@ export function render_effect(fn, flags = 0) { * @param {Array<() => Promise>} async */ export function template_effect(fn, sync = [], async = [], d = derived) { - var batch = /** @type {Batch} */ (current_batch); + var batch = current_batch; var parent = /** @type {Effect} */ (active_effect); if (async.length > 0) { @@ -349,12 +349,12 @@ export function template_effect(fn, sync = [], async = [], d = derived) { if ((parent.f & DESTROYED) !== 0) return; // TODO probably need to do this in async.js as well - batch.restore(); + batch?.restore(); restore(); create_template_effect(fn, [...sync.map(d), ...result]); - batch.flush(); + batch?.flush(); }); } else { create_template_effect(fn, sync.map(d)); diff --git a/packages/svelte/tests/runtime-runes/samples/async-error/_config.js b/packages/svelte/tests/runtime-runes/samples/async-error/_config.js index 8f6975f6fb..52ac432083 100644 --- a/packages/svelte/tests/runtime-runes/samples/async-error/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/async-error/_config.js @@ -10,6 +10,7 @@ export default test({ flushSync(() => button1.click()); await Promise.resolve(); await Promise.resolve(); + await Promise.resolve(); flushSync(); assert.htmlEqual( target.innerHTML,