Задать вопрос
@ArgeoMer

Как использовать AsyncThunk в middleware redux?

Начал реализовывать механизм, который обновляет раннее загруженные данные, если произошло действие связанное с авторизацией. Для этого решил написать middleware
export const updateData =
   (_store) =>
      (next) =>
         (action) => {
            if (action.type.startsWith('login/')) {
               next(fetchOffersAction())
            }
            return next(action)
         }


fetchOffersAction- создается через createAsyncThunk.
export const fetchOffersAction = createAsyncThunk(
   'data/fetchOffers',
   async (_arg, { dispatch, extra: api }) => {
      const { data } = await api.get('/offers')
      return data
   }
)


стор конфигурирую так:
const store = configureStore({
   reducer: reducer,
   middleware: (getDefaultMiddleware) =>
      getDefaultMiddleware({
         thunk: {
            extraArgument: api
         }
      }).concat(redirect, updateData)
})


Но при выполнении получаю эту ошибку
Uncaught (in promise) Error: Actions must be plain objects. Use custom middleware for async actions.

Как это можно пофиксить или какой другой подход можно использовать, вместо middleware?
  • Вопрос задан
  • 117 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@ArgeoMer Автор вопроса
Next прокидывает action в следующий middleware или, если middleware больше нет, запускает action в редьюсер. По этому пути ясно, что acync Thunk не может быть обработан(он не встречает на этом пути необходимый DefaultMiddleware)
Чтобы это исправить достаточно отправить асtion не в следующий middleware, а прокинуть его в начала пути через store.dispatch(asyncThunk)
export const updateData: Middleware =
   (store) => {
      const dispatch = store.dispatch as AppDispatch
      return (next) =>
         (action: PayloadAction) => {
            if (action.type.startsWith('login/')) {
               dispatch(fetchOffersAction())
            }
            return next(action)
         }
   }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы