Snippetsadvanced
A tiny debounced signal helper
Wrap any signal in a debounced read — handy for search inputs without pulling in RxJS.
Introduction
Drop this into a shared util and debounce a source signal without a Subject in sight.
export function debounced<T>(source: () => T, ms: number): Signal<T> {
const out = signal(source());
let handle: ReturnType<typeof setTimeout>;
effect((onCleanup) => {
const value = source();
handle = setTimeout(() => out.set(value), ms);
onCleanup(() => clearTimeout(handle));
});
return out.asReadonly();
}