Redux Thunk-ի գործառույթը ինչ է և կարելի է առանց դրա ապրել?
sobes.tech AI
Պատասխան AI-ից
Redux Thunk — դա միջնորդական ծրագրակազմ (middleware) է Redux-ի համար, որը թույլ է տալիս գրել գործողությունների ստեղծողներ, որոնք վերադարձնում են ֆունկցիա փոխարեն սովորական օբյեկտի:
Այս ֆունկցիան ստանում է dispatch (այլ գործողություններ ուղարկելու համար) և getState (պահեստի ընթացիկ վիճակին մուտք գործելու համար) արգումենտները: Thunk-գործողությունները օգտակար են ասինխրոն գործողություններ կատարելու համար, ինչպիսիք են API-ներին հարցումներ ուղարկելը, նախքան սինխրոն գործողություն ուղարկելն՝ վիճակը թարմացնելու համար:
Անվճար Redux Thunk (կամ նման middleware, օրինակ՝ Redux Saga կամ Redux Observable) օգտագործելու դեպքում, գործողությունների ստեղծողները պետք է վերադարձնեն միայն օբյեկտներ, ինչը չի թույլատրում ուղիղ աշխատել ասինխրոն գործողությունների հետ՝ սովորական Redux-ում:
Այն կարելի է շրջանցել՝ օգտագործելով այլ middleware-ներ՝ side-էֆեկտների համար, ինչպիսիք են՝
- Redux Saga: օգտագործում է գեներատորներ՝ ասինխրոն գործողությունները կառավարելու համար, առաջարկելով ավելի հզոր և թեստավորելի մոտեցում:
- Redux Observable: հիմնված RxJS-ի վրա, օգտագործում է Observables՝ ասինխրոն տվյալների հոսքերը կառավարելու համար:
- Redux Promise Middleware: ավտոմատ կերպով մշակվում են պրոմիսները, գործողություններ ուղարկելով՝ դրանց լուծում կամ մերժումից հետո:
Ընտրությունը կախված է ասինխրոն լոգիկայի բարդությունից և թիմի նախընտրություններից: Պարզ դեպքերում Thunk-ը սովորաբար բավական է և հեշտ է սովորել: Կարծր դեպքերում՝ Saga կամ Observable-ը կարող են ավելի հարմար լինել:
Նմուշ՝ thunk-գործողություն:
// actions/user.js
import axios from 'axios'; // Օրինակ՝ գրադարանի օգտագործում API հարցումների համար
export const FETCH_USER_REQUEST = 'FETCH_USER_REQUEST';
export const FETCH_USER_SUCCESS = 'FETCH_USER_SUCCESS';
export const FETCH_USER_FAILURE = 'FETCH_USER_FAILURE';
// Սինխրոն գործողությունների ստեղծողներ
const fetchUserRequest = () => ({
type: FETCH_USER_REQUEST
});
const fetchUserSuccess = (user) => ({
type: FETCH_USER_SUCCESS,
payload: user
});
const fetchUserFailure = (error) => ({
type: FETCH_USER_FAILURE,
payload: error
});
// Ասինխրոն thunk-գործողություն ստեղծող
export const fetchUser = (userId) => {
return async (dispatch, getState) => {
dispatch(fetchUserRequest()); // Ուղարկում ենք սկսելու գործողություն
try {
const response = await axios.get(`/api/users/${userId}`); // Ասինխրոն հարցում
dispatch(fetchUserSuccess(response.data)); // Ուղարկում ենք հաջողության գործողություն տվյալներով
} catch (error) {
dispatch(fetchUserFailure(error.message)); // Ուղարկում ենք սխալի գործողություն
}
};
};