Time Remaining5:00
hardRace ConditionsReact

The race to render

A developer asked an AI assistant to fetch search results as the user types in a live search box. The suggested code works well on a fast connection, but on a throttled network, older searches sometimes overwrite newer ones with stale results.

LiveSearch.jsx
function LiveSearch() {
  const [results, setResults] = useState([]);

  const handleChange = async (e) => {
    const query = e.target.value;
    const res = await fetch(`/api/search?q=${query}`);
    const data = await res.json();
    setResults(data);
  };

  return <input onChange={handleChange} />;
}

A user quickly types 'r', then 'react'. The request for 'r' is slow and resolves after the request for 'react'. What does the results list show?

The results for 'r' — whichever fetch resolves last wins and overwrites state, regardless of which query was actually typed most recently.
The results for 'react' — React automatically cancels in-flight requests triggered by the same input.
A merged list combining both 'r' and 'react' results.
An empty list, because two overlapping fetches from the same component always throw.