0Pricing
React Academy · Lekcja

Asynchroniczne sugestie z debounce

Pobierać sugestie z API podczas pisania użytkownika, stosując debounce, aby unikać nadmiarowych żądań sieciowych

Asynchroniczne sugestie z debounce to bezpłatna lekcja React Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej React Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs React Academy zawiera 4 lekcji w sumie.

Zastępowanie statycznego filtrowania pobieraniem z API

Zamiast filtrować lokalną tablicę, należy wywołać endpoint API, który zwraca pasujące sugestie na podstawie zapytania. Wywołanie API należy umieścić w useEffect zależnym od wartości wejściowej po debounce. W ten sposób odpowiedzialność za filtrowanie zostaje przeniesiona na serwer, co umożliwia dopasowanie rozmyte, ustalanie rankingu oraz generowanie sugestii na podstawie znacznie większego zbioru danych.

Nowy stan ładowania i błędu

Do komponentu autocomplete należy dodać dwie nowe zmienne stanu: isLoading (boolean) do wyświetlania wskaźnika ładowania podczas pobierania oraz error (string lub null) do wyświetlania komunikatu o błędzie, gdy pobieranie się nie powiedzie. Dzięki temu użytkownicy otrzymują informację o operacji asynchronicznej, zamiast zastanawiać się, dlaczego sugestie się nie pojawiają.

Efekt pobierania

W efekcie pobierania useEffect należy na początku ustawić setIsLoading(true) i setError(null), następnie wywołać fetch(url), sparsować dane JSON, wywołać setSuggestions(data), a na końcu ustawić setIsLoading(false) w bloku finally lub po obu ścieżkach: powodzenia i błędu. Tablica zależności efektu powinna zawierać wyłącznie debouncedInputValue.

Używanie AbortController do anulowania żądań

Na początku efektu należy utworzyć nowy obiekt AbortController i przekazać controller.signal do opcji fetch. W funkcji czyszczącej należy wywołać controller.abort(). Gdy użytkownik pisze i zmienia się wartość po debounce, poprzednie pobieranie zostaje anulowane przed rozpoczęciem nowego, co zapobiega napływaniu nieaktualnych wyników w niewłaściwej kolejności.

Obsługa błędów anulowania

Po anulowaniu pobierania obietnica zostaje odrzucona z obiektem DOMException o nazwie AbortError. W bloku catch należy sprawdzić if (err.name === 'AbortError') return;, aby po cichu ignorować anulowane pobierania. Należy obsługiwać tylko rzeczywiste błędy sieci lub błędy API, które powinny zostać pokazane użytkownikowi.

Zarządzanie stanem isLoading

Wartość isLoading należy ustawić na true przed pobieraniem i na false po jego zakończeniu — niezależnie od tego, czy operacja się powiedzie, czy zakończy błędem. Należy użyć bloku finally, aby zagwarantować jej zresetowanie: fetch(url).then(...).catch(...).finally(() => setIsLoading(false)). Bez bloku finally błąd pobierania sprawiłby, że wskaźnik ładowania byłby wyświetlany bez końca.

Wskaźnik ładowania w menu rozwijanym

Gdy isLoading ma wartość true, a pole wejściowe zawiera tekst, należy wyświetlić menu rozwijane z wyśrodkowanym wskaźnikiem zamiast listy sugestii. Informuje to użytkownika, że wyniki są w drodze. Gdy ładowanie się zakończy i pojawią się sugestie, należy zastąpić wskaźnik właściwymi elementami sugestii.

Stan błędu w menu rozwijanym

Gdy error nie ma wartości null, należy wyświetlić menu rozwijane z komunikatem o błędzie zamiast sugestii. Komunikat taki jak "Nie udało się wczytać sugestii. Spróbuj ponownie." jest przyjaźniejszy niż surowy tekst błędu. Opcjonalnie można dodać przycisk ponowienia, który ręcznie uruchamia pobieranie.

Minimalna liczba znaków

Należy unikać pobierania dla pustych ciągów lub bardzo krótkich zapytań, które generują zbyt wiele nieistotnych wyników. Na początku efektu należy zastosować warunek ochronny: if (debouncedInputValue.length < 2) { setSuggestions([]); return; }. Zmniejsza to liczbę zbędnych wywołań API i zapobiega wyświetleniu przytłaczającej listy wyników po wpisaniu jednego znaku.

Buforowanie pobranych wyników

Pobrane wyniki należy przechowywać w obiekcie Map umieszczonym w useRef: const cache = useRef(new Map()). Przed pobieraniem należy sprawdzić if (cache.current.has(query)) { setSuggestions(cache.current.get(query)); return; }. Po pomyślnym pobraniu należy zapisać wynik. Eliminuje to zbędne żądania sieciowe dla zapytań, które użytkownik już wpisał.

Zalecane opóźnienie debounce

W przypadku autocomplete optymalnym opóźnieniem debounce jest 200-300ms. Krótsze opóźnienia (poniżej 200ms) powodują zbyt wiele żądań u osób szybko piszących. Dłuższe opóźnienia (powyżej 400ms) sprawiają, że sugestie wydają się powolne i niereaktywne. W implementacjach autocomplete używanych produkcyjnie często stosuje się domyślnie 250ms.

AbortController w autocomplete

Dlaczego AbortController jest ważny w komponencie autocomplete wykorzystującym debounce i pobierającym dane z API?

Podsumowanie lekcji: Asynchroniczne sugestie z debounce

Statyczne filtrowanie należy zastąpić pobieraniem z API wewnątrz useEffect zależnego od wartości po debounce. Należy użyć AbortController do anulowania nieaktualnych żądań. Należy dodać stany isLoading i error, aby przekazywać użytkownikowi informacje o stanie operacji. Należy ustawić minimalną liczbę znaków, aby uniknąć nadmiernej liczby wywołań. Wyniki należy buforować w ref, aby pomijać zbędne żądania sieciowe.

Często zadawane pytania

Czy lekcja „Asynchroniczne sugestie z debounce” jest bezpłatna?

Tak — pełny tekst „Asynchroniczne sugestie z debounce” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu React Academy, przejdź na CoddyKit PRO. Kurs React Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Asynchroniczne sugestie z debounce”?

Pobierać sugestie z API podczas pisania użytkownika, stosując debounce, aby unikać nadmiarowych żądań sieciowych Ćwiczysz React Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć React Academy?

Nie wymagamy żadnego doświadczenia. React Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Asynchroniczne sugestie z debounce”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji React Academy?

Tak. Każda lekcja React Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Kontrolowany input z listą sugestii
  2. Nawigacja klawiaturą po listach sugestii
  3. Asynchroniczne sugestie z debounce
  4. Dostępność widgetów autouzupełniania
← Powrót do React Academy