Rabin R
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();
}