About reatom-async
reatom-async is a development skill focused on Reatom async behavior. It helps developers implementing or reviewing async flows find guidance on queries, mutations, cancellation, sampling, and Suspense.
Key features
- 01Locate async references by topic
- 02Distinguish query and mutation patterns
- 03Explain context rules across async boundaries
- 04Cover cancellation, races, and throttling
- 05Guide loading states and retries
Use cases
- 01Implement Reatom async queries or commands
- 02Check context handling after await
- 03Design cancellation, throttling, or race flows
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ reatom/ reatom --skill reatom-asyncAfter installing, type/reatom-asyncin Claude Code to confirm it loaded.
Bundled filesREFERENCE.md
Details
From the project READMEReatom Async
Use this skill when the task is mainly about Reatom async behavior. Treat REFERENCE.md as the bundled async source of truth.
How to Use
- Read only the REFERENCE.md sections that match the task.
- Prefer Reatom async patterns over debounce libraries, mount-time fetches, refs, local component promise state, or manual AbortController bookkeeping.
- For general Reatom modeling, use the
reatomskill. For@reatom/jsxDOM JSX specifics, usereatom-jsx. For reviews, combine this skill withreatom-review. - If docs, source, and tests disagree, prefer source and tests, then fix the doc/example that is stale.
Section Map
- Queries and mutations:
Choosing the Primitive,withAsyncData,withAsync - Context after
await:wrap Rules - Cancellation:
withAbort,abortVar and Fetch Signals - Debounce, throttle, waits, races:
Sampling and Procedural Async - Redux-saga migration:
Redux-Saga Mapping - Loading UI and retry:
Status, Retry, Reset - Suspense:
Suspense Boundaries - Code review:
Common Mistakes,Tested Edge Cases
Implementation Defaults
- Query/read data:
computed(async () => ...).extend(withAsyncData({ initState })). - Command/mutation:
action(async () => ...).extend(withAsync(...)); addwithAbort(...)when stale calls must stop. - Every async boundary that leaves a Reatom frame uses
await wrap(promise). - External callbacks that call Reatom state/actions are passed as
wrap(fn)or wired withonEvent. - Abortable fetches use
signal: abortVar.require().signalor a scopedabortVar.subscribe(). - Debounce and throttle follow the sampling docs:
await wrap(sleep(ms))inside the flow pluswithAbort()strategies, not split debounce helpers. - Route/page data belongs in route loaders or async computeds, not component effects.
- Form submit is an async mutation: put it in
reatomForm({ onSubmit })and use fieldvalidatefor async/dependent checks (debounce withawait wrap(sleep(ms))), instead of hand-rolled submit actions or debounced validators. - Suspense is for global one-shot initialization, not dynamic page data.
Review Defaults
- Flag unwrapped awaits before atom/action calls.
- Flag
withAsyncused for query data wherewithAsyncDatashould own.data. - Flag
withAsyncwithoutwithAbortwhen stale command calls can update state. - Flag
.status()without{ status: true }. - Flag action
.retry()without{ cacheParams: true }. - Flag
withCache()beforewithAsync()/withAsyncData(). - Flag aborts displayed as business errors.
- Flag raw
Promise.racewhen loser cleanup is needed.
Comments
Markdown supported