Skip to content

fix: correctly coordinate component-level effects inside async blocks#18260

Merged
dummdidumm merged 1 commit into
mainfrom
correctly-defer-effect-in-async-block
May 21, 2026
Merged

fix: correctly coordinate component-level effects inside async blocks#18260
dummdidumm merged 1 commit into
mainfrom
correctly-defer-effect-in-async-block

Conversation

@dummdidumm

Copy link
Copy Markdown
Member

While looking at the reproduction in #18221 (comment) I immediately got greeted with a runtime error when running it in the playground (weirdly not in the Stackblitz version). The error was that a component expected a binding to be set in onMount, but the timing of onMount was wrong.

Turns out it's because our logic to determine whether or not to defer top level effects is flawed. REACTION_RAN, which was used previously, is already set if the initialized component is inside an async block. We instead check for component_context.i which is set to true on pop().

While looking at the reproduction in #18221 (comment) I immediately got greeted with a runtime error when running it in the playground (weirdly not in the Stackblitz version). The error was that a component expected a binding to be set in onMount, but the timing of onMount was wrong.

Turns out it's because our logic to determine whether or not to defer top level effects is flawed. `REACTION_RAN`, which was used previously, is already set if the initialized component is inside an async block. We instead check for `component_context.i` which is set to `true` on `pop()`.
@changeset-bot

changeset-bot Bot commented May 21, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: c29eb51

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
svelte Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

Copy link
Copy Markdown
Contributor

Playground

pnpm add https://pkg.pr.new/svelte@18260

@jkbz64

jkbz64 commented May 21, 2026

Copy link
Copy Markdown

Stackblitz did not throw this error because virtua version was pinned to 0.47.2, new versions misbehave w/ async/boundaries, playground pulled the latest version. Should've noted this, sorry.

@dummdidumm

Copy link
Copy Markdown
Member Author

No worries, this caught another bug so that's good 😄

@dummdidumm dummdidumm merged commit 91a42e2 into main May 21, 2026
20 of 21 checks passed
@dummdidumm dummdidumm deleted the correctly-defer-effect-in-async-block branch May 21, 2026 18:25
@github-actions github-actions Bot mentioned this pull request May 21, 2026
Rich-Harris pushed a commit that referenced this pull request May 27, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## svelte@5.55.10

### Patch Changes

- fix: unlink errored and otherwise finished batch
([#18264](#18264))

- perf: walk composedPath() directly in delegated event propagation
([#18268](#18268))

- fix: transfer effects when merging batches
([#18254](#18254))

- fix: allow `$derived(await ...)` in disconnected effect roots
([#18273](#18273))

- fix: remove temporary raw-text hydration markers
([#18269](#18269))

- fix: propagate async `@const` blockers through closure references so
template expressions like `{(() => host)()}` correctly wait for the
awaited value ([#18309](#18309))

- fix: properly unlink batches
([#18298](#18298))

- fix: settle discarded batch
([#18290](#18290))

- fix: declare `let:` directives before `{@const}` declarations on
slotted elements
([#18271](#18271))

- fix: resume outro-ed branches if they were kept around
([#18291](#18291))

- fix: avoid waterfall-warning when async resolves to same value
([#18297](#18297))

- fix: correctly coordinate component-level effects inside async blocks
([#18260](#18260))

- fix: make unnecessary commit work less likely
([#18263](#18263))

- chore: add tag name to `a11y_click_events_have_key_events` warning
([#18272](#18272))

- fix: catch rejected promises while merging/committing
([#18266](#18266))

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants