Skip to main content
← ⚑ JavaScript & the browserΒ·Module C4 Β· Lesson 10
TaskBuild the debounced + aborted search. <input id='q' value='anna' /> + <ul id='out'></ul>. On 'input', debounce 200ms then fetch '/api/search?q=' + value, abort previous, parse JSON, render each result as <li>. To make the test exercise the flow, also call the same handler once on load.

Build a Live Search Box with Fetch, Debounce and AbortController

250 XP14 min
Theory

Putting C4 together

The most-built feature in any modern frontend: a search box that fires off a fetch as you type and shows results. Three things go wrong if you do it naively:

  1. Spam β€” typing "anna" fires four fetches; the network thrashes.
  2. Stale results β€” earlier responses arrive after later ones and overwrite the right answer.
  3. Errors don't help β€” user typed "an" but sees error for "a" because they raced.

The fix

Three patterns from C4 stacked together:

  1. Debounce β€” wait until the user stops typing (200ms) before fetching.
  2. AbortController β€” cancel any in-flight request when a new one starts.
  3. r.ok check β€” surface real HTTP errors, ignore AbortErrors.
let lastController = null;
let timer = null;

input.addEventListener("input", () => {
  clearTimeout(timer);
  timer = setTimeout(async () => {
    lastController?.abort();
    lastController = new AbortController();
    try {
      const r = await fetch(\`/api/search?q=${encodeURIComponent(input.value)}\`, {
        signal: lastController.signal,
      });
      if (!r.ok) throw new Error(\`HTTP ${r.status}\`);
      const data = await r.json();
      renderResults(data.results);
    } catch (err) {
      if (err.name === "AbortError") return;
      console.error(err);
    }
  }, 200);
});

Why this pattern is everywhere

Autocomplete in Google, GitHub repo search, npm package search, every admin-panel filter. Same shape. Once you've written it for one project, you'll recognize it in every codebase.

The capstone

Build that exact pattern. The fetch mock simulates an autocomplete API β€” typing "a", "ann", or "anna" returns different result sets. Your code should:

  • Debounce the input event to 200ms.
  • Abort the previous fetch on every new typed character.
  • Render the JSON.results array as <li> items inside <ul id="out">.
πŸ”’

Sign up to start coding

Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial β€” card required, cancel anytime.

Sign up β€” free trial β†’

First 10 lessons in each track are free. No card needed for those.

← PreviousNext lesson β†’

Get one Python or web tip a day β€” by email

Short, hand-written, no spam. Unsubscribe in one click.