Na ten moment asynchroniczność w aplikacjach wydaje się być nierozłączna. Dlatego podczas korzystania z Redux, decydujemy się na wybór middleware, który pomoże nam obsłużyć tak zwane “side effects”.
Może to być na przykład:
- zapisywanie pliku,
- ustawienie asynchronicznego stopera,
- wysłanie żądania HTTP.
Aktualnie do wyboru mamy dwa najpopularniejsze middleware, które pozwalają nam na tworzenie asynchronicznych akcji: Redux-Saga oraz Redux-Thunk, który poznamy lepiej w poniższym artykule.
Czym jest Redux-Thunk?
Jest to middleware, którego celem jest ułatwienie nam dodania pewnej logiki lub uruchomieniu kodu asynchronicznego przed wysłaniem akcji. Pozwala nam napisać funkcję, która jako argument może przyjmować dispatch oraz getState.
dispatch – jest to metoda służąca do wysyłania akcji, które mogą zostać odebrane przez reducer.
getState – pozwala na uzyskanie danych ze store.
Co oznacza słowo “thunk”?
Definicyjnie thunk oznacza:
fragment kodu, który wykonuje pewną opóźnioną pracę.
Inaczej jest to określenie funkcji, która zwraca inną funkcję. W pewnym sensie opóźnia ona wywołanie funkcji zwracanej o określony przedział czasu.
Asynchroniczny przepływ danych w Redux
Na samym starcie musimy obsłużyć zdarzenie użytkownika w aplikacji, takie jak kliknięcie przycisku. Następnie wywołujemy dispatch().
Gdy rozpoczęta akcja dotrze do middleware, może wykonać działanie asynchroniczne, a po zakończeniu wysłać rzeczywisty obiekt akcji.
Podczas dodawania logiki asynchronicznej do aplikacji Redux, wykonujemy dodatkowy krok, za pomocą którego middleware będzie mógł wysłać żądanie HTTP do API.
Powyższy schemat przedstawia asynchroniczny przepływ danych w Redux.
Przykładowy projekt z wykorzystaniem Redux-Thunk
Na potrzeby artykułu stworzymy prostą aplikację React, Redux + Redux-Thunk, która będzie wyświetlała filmy. Do tego celu skorzystamy z API ze strony https://www.themoviedb.org/.
Instalacja Redux-Thunk w projekcie
Dodanie middleware do Reduxa
- ./store/index.js
Tworzenie typów dla różnych stanów akcji dla pobierania filmów
- ./store/actions/actionTypes.js
Podstawowe akcje dla napisanych wcześniej stanów
- ./store/actions/movies.js
Thunk, który działa tak samo jak zwykła akcja
Nadal wysyłamy wartość zwracaną, ale tym razem zamiast obiektu zwraca nam ona funkcję.
Początkowo wywołujemy funkcję dispatch(fetchMoviesStart()) odpowiadającą za rozpoczęcie ładowania się filmów.
Następnie obsługujemy asynchroniczne zapytanie do API, aby pozyskać filmy. Przy użyciu dispatch(fetchMoviesSuccess(movies.results)) przekazujemy dane do store.
setTimeout służy nam do opóźnienia wywołania akcji w celu pokazania efektu ładowania się na interfejsie.
W przypadku wystąpienia błędu wykonuje się dispatch(fetchMoviesFail(error). Za pomocą tej akcji pozyskujemy informacje o błędzie.
Dodatkowo niezależnie czy zapytanie do API się powiedzie, przerywamy ładowanie.
- ./store/actions/movies.js
Konfiguracja reducera
- ./store/reducers/movies.js
Prezentacja aplikacji
Podsumowanie
Redux-Thunk to świetne rozwiązanie dla niewielkich aplikacji, które potrzebują narzędzia do obsługi operacji asynchronicznych. Jest to doskonały wybór dla osób dopiero uczących się Redux z uwagi na jego prostą implementację. Gdy już poczujesz się z nim komfortowo, dobrym pomysłem jest wypróbowanie alternatyw takich jak Redux-Saga czy Redux-Observable.
Szukasz pracy, w której możesz rozwijać swoje zainteresowania i na bieżąco zdobywać nowe umiejętności? Sprawdź nasze oferty!