Function: watchAtom()
API / @xmachines/play-atom / watchAtom
function watchAtom<T>(atom, onValue): () => void;Defined in: watch-atom.ts:57
Subscribes to one atom, and coalesces the notifications into one microtask.
@xstate/store notifies an observer SYNCHRONOUSLY from set. This function keeps
that notification, and it defers the callback to a microtask. One batch of
synchronous writes therefore calls the callback one time, with the last value. The
cleanup function is idempotent.
The lifecycle:
- The
disposedflag stops a callback after the cleanup: the microtask returns at once when the cleanup runs before the microtask fires. - The
scheduledguard removes the duplicates of rapid synchronous writes: one batch of synchronous writes queues one microtask only. - The guard clears BEFORE the callback, and not after it. A callback that WRITES the atom that it watches therefore schedules the next delivery, and it reaches the caller with the value that it wrote. A callback that THROWS keeps the watch, because the throw leaves the microtask and never reaches the subscription.
The library owns the dependency edges. @xstate/store builds the subscription on an
effect, and the effect holds ONE edge to the atom for the life of the watch. A caller
therefore arms the watch one time, and no call site of this function counts emissions
or re-arms anything.
A CAUTION for a callback that writes the atom that it watches: the write reaches the callback, so a callback that writes a NEW value on every call runs again for ever, and the microtask queue drains never. That is the loop of the caller, and this function bounds it not. A write of the SAME value ends the sequence by itself, because an atom notifies for a value that it holds already never.
The return is a plain function. A caller that keeps the release in a field runs it
from a teardown. A caller inside one scope publishes it with asDisposable of
@xmachines/core/utils, writes using, and writes no teardown:
using stop = asDisposable(watchAtom(count, render));Type Parameters
| Type Parameter |
|---|
T |
Parameters
| Parameter | Type | Description |
|---|---|---|
atom | Readable<T> | The Atom or the ReadonlyAtom to subscribe to. |
onValue | (value) => void | The function reads the current atom value after each change. |
Returns
The release. It removes the subscription.
() => void
Example
import { createAtom, watchAtom } from "@xmachines/play-atom";
const count = createAtom(0);const stop = watchAtom(count, (value) => console.log(value));
count.set(1);count.set(2); // One microtask, and the callback reads 2 one time.
stop();