Optimistic store update is hidden after a local derived-store write inside an action
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 48/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- javascript, typescript
- Domain
- frontend
Research direction
The report provides a playground reproduction but names no source files or tests. Start by running the reproduction and tracing how createOptimisticStore handles the local derived-store write and the following optimistic write while the action is pending. Done means the view shows New / saving: true during the save and reconciles to the authoritative source after completion.
Written by the indexing model from the issue text.
Description
Describe the bug
On experimental build 6f77b1b, writing a client-only flag to a writable derived store inside an action prevents a subsequent optimistic store update from appearing while that action is pending.
The optimistic store wraps the derived store. The local write only sets failed = false; the optimistic write changes title to "New" and sets saving = true. A direct JSX binding keeps showing "Old" and saving: false until the action completes.
const [cards, setOptimistic] = createOptimisticStore(local);
const save = action(function* () {
setLocal(draft => { draft[0].failed = false; });
setOptimistic(draft => {
draft[0].title = "New";
draft[0].saving = true;
});
yield completion;
});
Removing the setLocal call makes the optimistic update appear. The reproduction uses a normal component and direct text binding, without For, Show, routing, or external data loading.
Your Example Website or App
https://s.olid.uk/id/d27cf7de-2cc1-45a8-9144-6868e307a78f
Steps to Reproduce the Bug or Issue
- Open the playground and click Run once.
- During the two-second simulated save, observe
Old / saving: falseinstead of the optimistic values. - After completion, the display changes to
New / saving: false. The report records both states. - Reload and remove the marked
setLocalcall to compare: the optimistic values appear during the save.
Expected behavior
The optimistic view should immediately show New / saving: true while the action is pending, including when the action first writes to its underlying local store. After completion, it should follow the authoritative source with the temporary saving flag removed.
Platform
- OS: Linux (Ubuntu / WSL)
- Browsers: Chromium 153.0.8010.12 and Firefox 155.0; identical results
- Solid:
solid-js,@solidjs/web, and@solidjs/signalsfrom the Zulu6f77b1bpreview: https://github.com/mizulu/solid2/issues/1#issuecomment-5993985409 - Native compiler:
@solidjs/compiler2.0.0-rc.13
Additional context
The identical reproduction with published RC.13 is here: https://s.olid.uk/id/cf602874-eee9-400c-bd96-3022a77b7291
| With the local flag write | RC.13 | 6f77b1b |
|---|---|---|
| During the pending action | New / saving: true |
Old / saving: false |
| After completion | Old / saving: false |
New / saving: false |
RC.13 shows the optimistic update correctly but suppresses the later source reconciliation discussed in #3733. The newer build reconciles correctly after completion, but loses the optimistic display while pending. Both playgrounds have Tailwind disabled.
- Dominant language
- TypeScript
- Stars
- 36.1k
- Forks
- 1.1k
- Avg merge
- 11h 42m
- Merged PRs (30d)
- 326
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from solidjs/solid
-
[2.0 next, regressed after rc.13] Async-generator action times out on its authoritative live echoOpen
Difficulty 3/5 1-2 days Newbie friendliness 55/100
Maintainers usually reply within 1 day
-
Difficulty 3/5 Half a day Newbie friendliness 75/100
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 64/100
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 48/100
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 55/100
Maintainers usually reply within 1 day
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
farbenmeer/tapi#531 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
naver/egjs-flicking#971 ·
-
Renderer treats a sub-pixel width difference as a resize, which cancels the `motion()` entranceOpen
Difficulty 1/5 Under an hour Newbie friendliness 85/100
Maintainers usually reply within 1 day
-
Tenant
Difficulty 2/5 1-3 hours Newbie friendliness 66/100
MTES-MCT/Dossier-Facile-Frontend#2061 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
backnotprop/plannotator#1784 ·
Maintainers usually reply within 1 day