Describe the bug
A newly created async memo reads an update that is still held by an existing async derivation, then notifies a scheduled render effect before that update is revealed. The existing scheduled render effect still last reported count = 1, slow = 1, while the new one reports 2.
The same newly created memo stays held when its first result is synchronous. Returning Promise.resolve(count()) instead makes it reveal early.
Your Example Website or App
https://s.olid.uk/id/22KYZfNOSnqqlHlUzL1MqQ
Steps to Reproduce the Bug or Issue
- Open the playground console and press Build (or reload).
- After about one second, observe
parent 1 1.
- About 100ms later, observe
child 2 while the parent is still held at 1 1.
- Roughly one second after that, the slow derivation settles and the parent finally reports
parent 2 2.
Expected behavior
The new scheduled render observer should stay held until the input update can be revealed with its slow derivation. An asynchronous first result should preserve the inherited hold, just as a synchronous first result does.
Screenshots or Videos
No response
Platform
- OS: Linux
- Browser: Chromium 151.0.7922.173
- Solid: 2.0.0-rc.13 in the playground; also reproduced on upstream
next at b0bad02, in development and production.
Additional context
Both render effects use { schedule: true }, so this excludes the immediate mounting-effect path. The repro uses only primitives.
Two controls preserve the hold:
- Replace
Promise.resolve(count()) with count().
- Remove the explicit
flush() before creating the new memo.
The development warnings about unowned effects are expected in this minimal repro.
Related earlier report: #3408. Here the synchronous first result behaves correctly; the asynchronous first result does not.
Describe the bug
A newly created async memo reads an update that is still held by an existing async derivation, then notifies a scheduled render effect before that update is revealed. The existing scheduled render effect still last reported
count = 1, slow = 1, while the new one reports2.The same newly created memo stays held when its first result is synchronous. Returning
Promise.resolve(count())instead makes it reveal early.Your Example Website or App
https://s.olid.uk/id/22KYZfNOSnqqlHlUzL1MqQ
Steps to Reproduce the Bug or Issue
parent 1 1.child 2while the parent is still held at1 1.parent 2 2.Expected behavior
The new scheduled render observer should stay held until the input update can be revealed with its slow derivation. An asynchronous first result should preserve the inherited hold, just as a synchronous first result does.
Screenshots or Videos
No response
Platform
nextat b0bad02, in development and production.Additional context
Both render effects use
{ schedule: true }, so this excludes the immediate mounting-effect path. The repro uses only primitives.Two controls preserve the hold:
Promise.resolve(count())withcount().flush()before creating the new memo.The development warnings about unowned effects are expected in this minimal repro.
Related earlier report: #3408. Here the synchronous first result behaves correctly; the asynchronous first result does not.