Kāda ir Redux Thunk funkcija un vai bez tās var iztikt?
sobes.tech AI
Atbilde no AI
Redux Thunk — tas ir starpnieks (middleware) priekš Redux, kas ļauj rakstīt darbību veidotājus, kas atgriež funkciju vietā parastu objektu.
Šī funkcija saņem argumentus dispatch (citu darbību sūtīšanai) un getState (lai piekļūtu pašreizējajai glabāšanas stāvoklim). Thunk darbības ir noderīgas asinhronām operācijām, piemēram, API pieprasījumiem, pirms sūtīt sinhronu darbību stāvokļa atjaunināšanai.
Bez Redux Thunk (vai līdzīga middleware, piemēram, Redux Saga vai Redux Observable) darbību veidotājiem ir jāatgriež tikai objekti, kas neļauj tieši apstrādāt asinhronas operācijas standarta Redux ietvaros.
To var izvairīties, izmantojot citus middleware, piemēram:
- Redux Saga: izmanto ģeneratorus, lai pārvaldītu asinhronas operācijas, piedāvājot jaudīgāku un testējamu pieeju.
- Redux Observable: balstīts uz RxJS, izmanto Observables, lai pārvaldītu asinhronos datu plūsmas.
- Redux Promise Middleware: automātiski apstrādā promisas, nosūtot darbības to izšķirtu vai noraidītu gadījumā.
Izvēle ir atkarīga no asinhronās loģikas sarežģītības un komandas vēlmēm. Vienkāršiem gadījumiem Thunk parasti ir pietiekams un viegli apgūstams. Sarežģītākos scenārijos Saga vai Observable var būt piemērotāki.
Piemērs — thunk darbība:
// actions/user.js
import axios from 'axios'; // API pieprasījumu bibliotēkas piemērs
export const FETCH_USER_REQUEST = 'FETCH_USER_REQUEST';
export const FETCH_USER_SUCCESS = 'FETCH_USER_SUCCESS';
export const FETCH_USER_FAILURE = 'FETCH_USER_FAILURE';
// Sinhroni darbību veidotāji
const fetchUserRequest = () => ({
type: FETCH_USER_REQUEST
});
const fetchUserSuccess = (user) => ({
type: FETCH_USER_SUCCESS,
payload: user
});
const fetchUserFailure = (error) => ({
type: FETCH_USER_FAILURE,
payload: error
});
// Asinhroniska thunk darbība
export const fetchUser = (userId) => {
return async (dispatch, getState) => {
dispatch(fetchUserRequest()); // Sūta sākuma darbību
try {
const response = await axios.get(`/api/users/${userId}`); // Veic asinhrono pieprasījumu
dispatch(fetchUserSuccess(response.data)); // Sūta panākumu darbību ar datiem
} catch (error) {
dispatch(fetchUserFailure(error.message)); // Sūta kļūdas darbību
}
};
};