Skip to Content
Redux Middleware
Writing Thunks in Redux

To better appreciate redux-thunk, let’s review the process of retrieving data from a Redux store. For example, suppose we have a list of users’ data, and want to retrieve the data corresponding to the user with a particular id = 32. Assuming we have that user’s data in the store, we can access the user’s data by writing a selector to retrieve the information we need.

useSelector((state) => state.users.byId[32]);

But what if we don’t have that particular user in the store? Say, for example, that we need to fetch the user’s data from an API. Ideally, we would like to be able to dispatch an action creator that would first perform an asynchronous operation (fetching the data), and then dispatch a synchronous action (adding the data to the store) after the asynchronous operation completes.

This is where thunks come in handy. Up to this point, we’ve only written action creators that returned plain objects. But redux-thunk allows us to write action creators that return thunks, within which we can perform any asynchronous operations we like. Consider the following asynchronous action creator:

import { fetchUser } from './api' const getUser = (id) => { return async (dispatch, getState) => { const payload = await fetchUser(id); dispatch({type: 'users/addUser', payload: payload}); } }

getUser has two key parts: the synchronous outer function (otherwise known as the thunk action creator) which returns the inner, asynchronous thunk. The thunk receives dispatch and getState as arguments, and dispatches a synchronous action after the asynchronous operation (fetchUser) completes.

To get the user with id = 32, we can call dispatch(getUser(32)). Note that the argument to dispatch is not an object, but an asynchronous function that will first fetch the user’s data and then dispatch a synchronous action once the user’s information has been retrieved.



In your code editor, we’ve imported the function fetchRecipes, which makes an asynchronous request to fetch all the recipes to be displayed in our familiar app. Write a thunk action creator called loadRecipes that asynchronously fetches the recipes and dispatches a synchronous action with type = allRecipes/addRecipes and payload equal to the payload you get when the asynchronous request completes.

Folder Icon

Take this course for free

Already have an account?