Note • Jan 14, 2026
Debouncing Search Without Losing Responsiveness
Snappy API-backed search.
The Problem
Every keystroke fired a network request. Fast typists saw flickering results, out-of-order responses, and unnecessary load on the API.
What I Did
- Debounced input at 300ms — long enough to batch bursts, short enough to feel instant after a pause.
- Kept a request token (incrementing counter or
AbortController) so older responses never overwrite newer ones. - Showed a lightweight pending state on the field, not a full-page spinner.
Snippet (concept)
let debounceTimer: ReturnType<typeof setTimeout>;
let requestId = 0;
function onSearchChange(value: string) {
clearTimeout(debounceTimer);
debounceTimer = setTimeout(async () => {
const id = ++requestId;
const results = await fetchResults(value);
if (id !== requestId) return; // stale
setResults(results);
}, 300);
}
Takeaway
Debounce is not laziness — it’s coordination. Pair it with cancellation or staleness checks whenever results can arrive out of order.