diff --git a/packages/svelte/src/internal/client/dom/blocks/async.js b/packages/svelte/src/internal/client/dom/blocks/async.js index 9e8a4ed0d3..82f107ab29 100644 --- a/packages/svelte/src/internal/client/dom/blocks/async.js +++ b/packages/svelte/src/internal/client/dom/blocks/async.js @@ -14,10 +14,13 @@ export function async(node, expressions, fn) { boundary.update_pending_count(1); flatten([], expressions, (values) => { - // get values eagerly to avoid creating blocks if they reject - for (const d of values) get(d); + try { + // get values eagerly to avoid creating blocks if they reject + for (const d of values) get(d); - fn(node, ...values); - boundary.update_pending_count(-1); + fn(node, ...values); + } finally { + boundary.update_pending_count(-1); + } }); } diff --git a/packages/svelte/src/internal/client/reactivity/async.js b/packages/svelte/src/internal/client/reactivity/async.js index c4ff5eebf8..cd40bf0462 100644 --- a/packages/svelte/src/internal/client/reactivity/async.js +++ b/packages/svelte/src/internal/client/reactivity/async.js @@ -27,8 +27,6 @@ export function flatten(sync, async, fn) { Promise.all(async.map((expression) => async_derived(expression))) .then((result) => { - if ((parent.f & DESTROYED) !== 0) return; - batch?.activate(); restore(); @@ -36,7 +34,10 @@ export function flatten(sync, async, fn) { try { fn([...sync.map(d), ...result]); } catch (error) { - invoke_error_boundary(error, parent); + // ignore errors in blocks that have already been destroyed + if ((parent.f & DESTROYED) === 0) { + invoke_error_boundary(error, parent); + } } batch?.deactivate(); diff --git a/packages/svelte/tests/runtime-runes/samples/async-block-reject-each-during-init/_config.js b/packages/svelte/tests/runtime-runes/samples/async-block-reject-each-during-init/_config.js index a29c99860d..cd89439a72 100644 --- a/packages/svelte/tests/runtime-runes/samples/async-block-reject-each-during-init/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/async-block-reject-each-during-init/_config.js @@ -2,23 +2,24 @@ import { tick } from 'svelte'; import { test } from '../../test'; export default test({ - async test({ assert, target }) { - const [increment, shift] = target.querySelectorAll('button'); + async test({ assert, target, errors }) { + const [increment, resolve, reject] = target.querySelectorAll('button'); increment.click(); await tick(); - shift.click(); + reject.click(); await tick(); - shift.click(); + resolve.click(); await tick(); assert.htmlEqual( target.innerHTML, ` - + +

false

1

`