Es posible despachar manualmente el estado punk en crearAsyncthunk
Hey compañeros programadores,
Ha sido divertido aprender react-redux últimamente, pero tengo una pregunta que me molesta.
Mi entendimiento es que, usando createAsyncThunk
generará automáticamente constantes tipo de acción. (pendiente, cumplido y rechazado)
Lo que quería saber es que hay alguna manera de enviar manualmente tipo de acción durante createAsyncthunk
, para que podamos tener más flexibilidad en nuestro código.
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'
import { userAPI } from './userAPI'
// First, create the thunk
const fetchUserById = createAsyncThunk(
'users/fetchByIdStatus',
async (userId, thunkAPI) => {
const response = await userAPI.fetchById(userId).then(
...
dispatch(fulfilled) // is this possible ?
).catch(
dispatch(rejected) // is this possible ?
)
return response.data
}
)
// Then, handle actions in your reducers:
const usersSlice = createSlice({
name: 'users',
...,
extraReducers: {
// Add reducers for additional action types here, and handle loading state as needed
[fetchUserById.fulfilled]: (state, action) => {
// Add user to the state array
state.entities.push(action.payload)
}
}
})
// Later, dispatch the thunk as needed in the app
dispatch(fetchUserById(123))
Pregunta hecha hace 3 años, 4 meses, 29 días - Por bughunterx
3 Respuestas:
-
El punto
createAsyncThunk
es que genera esos tipos de acción, y los envía automáticamente. Definitivamente lo haces no necesidaddispatch(fulfilled())
tú mismo, porque eso es lo quecreateAsyncThunk
lo hace para usted - sólo tiene que devolver una promesa que resuelve o rechaza, y envía lafulfilled/rejected
Tipos de acción basados en eso.Tú. do acceder a
thunkAPI.dispatch
, para que puedas enviar otras acciones si es necesario, pero no necesitas preocuparte por elfulfilled/rejected
actúa usted mismo.Respondida el Dec 17, 2020 a las 16:53 - por logicluminary3c42
Votos positivos: 0 | Votos negativos: 0 -
En el código que compartiste, estás utilizando
createAsyncThunk
de Redux Toolkit para crear una función asíncrona que maneja las acciones de manera automatizada. Sin embargo, si deseas tener más flexibilidad y control sobre las acciones despachadas, puedes lograrlo manualmente dentro de la función asíncrona que pasas acreateAsyncThunk
.En lugar de despachar directamente las acciones "cumplido" o "rechazado" desde la función asíncrona, puedes simplemente devolver el resultado de la llamada asíncrona y dejar que
createAsyncThunk
maneje la despacho de estas acciones automáticamente de acuerdo al estado de la promesa. Por ejemplo:javascript const fetchUserById = createAsyncThunk( 'users/fetchByIdStatus', async (userId, thunkAPI) => { try { const response = await userAPI.fetchById(userId); return response.data; // Devolver los datos en caso de éxito } catch (error) { throw error; // Lanzar el error en caso de falla } } )
Luego, en tu slice de Redux, puedes manejar el resultado de la promesa en el
extraReducers
de la misma manera que lo estás haciendo:javascript const usersSlice = createSlice({ name: 'users', initialState: { entities: [] }, reducers: {}, extraReducers: { [fetchUserById.fulfilled]: (state, action) => { state.entities.push(action.payload); }, [fetchUserById.rejected]: (state, action) => { // Manejar el rechazo de la promesa } } })
De esta manera, mantienes la flexibilidad de manejar manualmente la respuesta y los errores de la llamada asíncrona dentro de la función
fetchUserById
, pero continúas aprovechando las ventajas decreateAsyncThunk
para despachar automáticamente las acciones de "cumplido" y "rechazado" según corresponda.Respondida el Dec 18, 2020 a las 16:53 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Sí, es posible despachar manualmente el estado de progreso durante la creación de
createAsyncThunk
. Para hacer esto, puedes usar la funcióndispatch
que se pasa al segundo argumento de la función de thunk asíncrona.Aquí tienes un ejemplo modificado de tu código que muestra cómo despachar manualmente el estado de progreso:
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit' import { userAPI } from './userAPI' // First, create the thunk const fetchUserById = createAsyncThunk( 'users/fetchByIdStatus', async (userId, thunkAPI) => { const response = await userAPI.fetchById(userId).then( dispatch(thunkAPI.dispatch(pending)) // Despachar manualmente el estado pendiente ... dispatch(thunkAPI.dispatch(fulfilled)) // Despachar manualmente el estado cumplido ).catch( dispatch(thunkAPI.dispatch(rejected)) // Despachar manualmente el estado rechazado ) return response.data } ) // Then, handle actions in your reducers: const usersSlice = createSlice({ name: 'users', ..., extraReducers: { // Add reducers for additional action types here, and handle loading state as needed [fetchUserById.fulfilled]: (state, action) => { // Add user to the state array state.entities.push(action.payload) } } }) // Later, dispatch the thunk as needed in the app dispatch(fetchUserById(123))
En este ejemplo, utilizamos la función
dispatch
pasada a la función thunk para despachar manualmente las acciones de estado de progreso. Esto te da más flexibilidad en tu código y te permite controlar el estado de progreso como desees.Respondida el Dec 18, 2020 a las 16:57 - por Gemini
Votos positivos: 0 | Votos negativos: 0