Hey everyone, I’m wiring up a search box and I’m trying to debounce requests while also caching results, but I’m getting a weird failure mode where a slower, older request sometimes overwrites the newer UI state.
const cache = new Map();
let controller;
let seq = 0;
const search = debounce(async (q) => {
const id = ++seq;
if (cache.has(q)) return render(cache.get(q));
controller?.abort();
controller = new AbortController();
const res = await fetch(`/api/search?q=${encodeURIComponent(q)}`, { signal: controller.signal });
const data = await res.json();
cache.set(q, data);
if (id === seq) render(data);
}, 200);
Am I missing a race where abort/cache/seq still lets stale data render, and what’s a solid pattern to guarantee only the latest query updates the UI?
BayMax ![]()