#reactjs #redux #redux-toolkit
Вопрос:
Я использую функцию createAsyncThunk инструментария Redux для запроса api. При выключении сети следующая функция возвращает действие.полезная нагрузка=»Ошибка сети» и статус = «успешно». Статус должен быть «ошибка». Но это возвращает успех. Есть какие-нибудь предложения по устранению проблемы ? Заранее спасибо.
import { createAsyncThunk, createSlice } from "@reduxjs/toolkit"; import axios from "axios"; import { GET_POSTS_API } from "./APIs"; const initialState = { posts: [], status: "idle", error: null }; export const getPosts = createAsyncThunk("posts/getPostsStatus", async () => { try { const { data } = await axios.get(GET_POSTS_API); return data; } catch (error) { return error.response ? error.response.data.message : error.message; } }); export const postsSlice = createSlice({ name: "posts", initialState, reducers: {}, extraReducers: { [getPosts.pending]: (state, action) => { state.status = "loading"; }, [getPosts.fulfilled]: (state, action) => { state.status = "success"; state.posts = action.payload; }, [getPosts.rejected]: (state, action) => { state.status = "error"; state.error = action.payload; }, }, }); export default postsSlice.reducer;
Ответ №1:
Когда вы return
вводите значение, вы сообщаете createAsyncThunk
, что это успешный fulfilled
запрос, и возвращаемое значение становится action.payload
.
Если вы полностью пропустите перехват ошибок и просто позволите axios.get()
вызову выполнить и отклонить само обещание, оно правильно отправит rejected
действие.
Если вы хотите , чтобы результат выполнения был учтен rejected
, но вы хотите настроить содержимое действия, вам необходимо использовать rejectWithValue()
util, как показано в наших документах:
https://redux-toolkit.js.org/api/createAsyncThunk#handling-thunk-errors
Комментарии:
1. большое вам спасибо, я уже исправил с помощью rejectWithValue() 👍 Еще один вопрос: Как использовать строковый параметр внутри функции createAsyncThunk, В приведенном выше примере я только вызвал [getPosts.выполнено], и это сработало, так почему я должен определять эту строку как «post/getPostStatus» ?
2.
createAsyncThunk
использует это для создания типов действий для всех трех сгенерированных действий, поэтому у него будет'post/getPostStatus/fulfilled'
и т. Д. Когда вы используете создателяgetPosts.fulfilled
действия в качестве ключа вычисляемого объекта, он неявно вызываетgetPosts.fulfilled.toString()
и возвращает строку типа действия. Однако теперь мы рекомендуем использовать синтаксис «обратного вызова построителяextraReducers
» вместо объекта.