Starsza odpowiedź nadpisuje nowszą — jak temu zapobiec?
Najpierw odpowiedz na głos lub w myślach, potem porównaj.
Odpowiedź
Przy zmianie zapytania anuluję poprzednią pracę i ignoruję jej późny wynik. Sam debounce ogranicza częstotliwość, ale nie rozwiązuje kolejności odpowiedzi.
JSX
useEffect(() => {
const controller = new AbortController();
let ignore = false;
setLoading(true);
setError(null);
fetch(`/api/search?q=${encodeURIComponent(query)}`, {
signal: controller.signal,
}).then(r => {
if (!r.ok) throw new Error(`HTTP ${r.status}`);
return r.json();
}).then(data => { if (!ignore) setResults(data); })
.catch(error => {
if (!ignore && error.name !== 'AbortError') setError(error);
}).finally(() => { if (!ignore) setLoading(false); });
return () => { ignore = true; controller.abort(); };
}, [query]);Doprecyzowanie: fragment zakłada istniejące settery stanu. Przy braku obsługi anulowania przez API pozostaje ochrona przed nieaktualnym wynikiem.
Jak poszło? Bądź szczery — „Jeszcze nie” dodaje pytanie do powtórki.
Powiązane pytania
- C02 · Jak uniknąć pokazania odpowiedzi dla starszego wyszukiwania? — React, Next.js i frontend
Przećwicz w kodzie
- Wyszukiwarka, która pokazuje stary wynik — uruchamia testy w przeglądarce