Skip to content
Observe

useObserveDebounced

Runs a reactive effect debounced — fires only after ms milliseconds of inactivity. Built on useObserveWithFilter. The selector always tracks dependencies; only the effect is debounced.

import {
import useObservable
useObservable
,
import useObserveDebounced
useObserveDebounced
} from "@usels/web";
function
function Component(): void
Component
() {
const
const query$: any
query$
=
import useObservable
useObservable
("");
// ✅ Effect fires only after query$ stops changing for 300ms
import useObserveDebounced
useObserveDebounced
(
() =>
const query$: any
query$
.
any
get
(),
(
value: any
value
) => {
any
console
.
any
log
("search:",
value: any
value
);
},
{
ms: number
ms
: 300 }
);
}

Use maxWait to guarantee the effect fires at least once, even if the source keeps changing continuously. The effect will fire after maxWait milliseconds regardless of activity.

import { useObservable, useObserveDebounced } from "@usels/web";
function Component() {
const input$ = useObservable("");
useObserveDebounced(
() => input$.get(),
(value) => {
console.log("submit:", value);
},
{ ms: 300, maxWait: 1000 }
);
}

Pass immediate: true to execute the effect immediately on setup, in addition to triggering on source changes.

import { useObservable, useObserveDebounced } from "@usels/web";
function Component() {
const count$ = useObservable(0);
// ✅ Also executes the effect immediately with the initial value
useObserveDebounced(
() => count$.get(),
(value) => {
console.log("value:", value);
},
{ ms: 300, immediate: true }
);
}

The schedule option controls when the effect runs relative to Legend-State’s batch cycle.

  • schedule: 'sync' — runs synchronously inside the batch (equivalent to Legend-State immediate: true)
  • schedule: 'deferred' — runs after the batch ends (equivalent to Legend-State immediate: false)
  • omitted — uses Legend-State’s default batching
useObserveDebounced(count$, (v) => console.log(v), { ms: 300, schedule: "sync" });
export { observeDebounced, type ObserveDebouncedOptions } from "./core";
export type UseObserveDebounced = typeof observeDebounced;
/**
* Runs a reactive effect debounced — fires only after `ms` milliseconds of inactivity.
*
* Built on `watch` — lazy by default (`immediate: false`).
* The selector always tracks deps; only the effect is debounced.
*
* @param selector - Observable, array of Observables, or reactive read function.
* @param effect - Side-effect callback. Fires after debounce delay.
* @param options - `ms` (default 200), `maxWait`, `immediate`, `schedule`.
*
* @example
* ```tsx twoslash
* // @noErrors
* import { useObserveDebounced } from "@usels/core";
* import { observable } from "@legendapp/state";
*
* const query$ = observable("");
*
* useObserveDebounced(
* () => query$.get(),
* (value) => { console.log("search:", value); },
* { ms: 300 }
* );
* ```
*/
export declare const useObserveDebounced: UseObserveDebounced;

View on GitHub