не могу получить набор инструментов redux для работы с async (createAsyncThunk)

Привет, друзья stackOverflow. Я начинаю использовать набор инструментов redux, но кое-что не понимаю.

У меня есть этот срез:

      const envSlice = createSlice({
  name: "env",
  initialState: { envs: [], loading: false, error: false },
  reducers: {},
  extraReducers: {
    [fetchEnv.pending]: (state) => {
      state.loading = true;
    },
    [fetchEnv.fulfilled]: (state, action) => {
      state.envs = action.payload;
      state.loading = false;
    },
    [fetchEnv.rejected]: (state) => {
      state.loading = false;
      state.error = true;
    },
  },
});

export default envSlice.reducer; 

И я пытаюсь получить данные с сервера mongo. этот код работал в обычном сокращении:

      --- fetching all the envs ---

export const fetchEnv = createAsyncThunk("admin/fetchEnv", (thunkAPI) => {
  axios
    .get("http://10.0.0.6:5000/admin/getAllEnv")
    .then((response) => response.data)
    .catch((error) => {
      console.log(error);
      return thunkAPI.RejectWithValue(error);
    });
});

Но почему-то всегда попадает в ловушку и отвергает - даже если это ответ.

этот код работает:

      export const fetchEnv = createAsyncThunk(
  "admin/fetchEnv",
  async (_, thunkAPI) => {
    try {
      const response = await axios.get("http://10.0.0.6:5000/admin/getAllEnv");
      return response.data;
    } catch (error) {
      return thunkAPI.rejectWithValue({ error: error.message });
    }
  }
);

Моя проблема в том, что я выполнил эту работу, но я не могу понять, почему первый createAsyncThunk не работает и почему второй работает.

Для меня обе функции выглядят одинаково.

Это пример из документации RTK (по какой-то причине они не охватывают обработку ошибок в этом примере, я не нашел ни одной):

Благодарность (: .

1 ответ

Из документации :

и функция обратного вызова, которая должна возвращать обещание

Ваш асинхронный преобразователь, который не работает, ничего не возвращает:

      export const fetchEnv = createAsyncThunk("admin/fetchEnv", (thunkAPI) => {
  return axios //<----return a promise
    .get("http://10.0.0.6:5000/admin/getAllEnv")
    .then((response) => response.data)
    .catch((error) => {
      console.log(error);
      return thunkAPI.RejectWithValue(error);
    });
});

Или у вас может быть функция стрелки без тела:

      export const fetchEnv = createAsyncThunk(
  'admin/fetchEnv',
  (
    thunkAPI 
  ) => //no { or }
    axios
      .get('http://10.0.0.6:5000/admin/getAllEnv')
      .then((response) => response.data)
      .catch((error) => {
        console.log(error);
        return thunkAPI.RejectWithValue(error);
      })
);
Другие вопросы по тегам