[英]How can I avoid requesting redox-saga action several times?
如果在執行getPost function時出現錯誤,我想通過catch(err)運行REFRESH_REQUEST,當REFRESH_SUCCESS完成后,我想再次運行GETPOST_REQUEST。
但是,使用我的代碼,GETPOST_REQUEST 和 REFRESH_REQUEST 運行多次,並且 GETPOST_GETPOST_SUCCESS 首先成功。
但是,我希望這兩個 REQUEST 都只執行一次,並且 REFRESH_SUCCESS 首先成功,然后第二個我希望 GETPOST_SUCCESS 成功。
這是我的代碼我該如何修復我的代碼?
function getPostAPI(data) {
return axiosInstace.post('/kakao/getpost', data);
}
function* getPost(action) {
try {
const result = yield call(getPostAPI, action.data);
yield put({
type: GETPOST_SUCCESS,
data: result.data,
});
} catch (err) {
yield put({
type: REFRESH_REQUEST,
});
yield put({
type: GETPOST_REQUEST,
data: action.data,
});
}
}
function refreshAPI() {
return axiosInstace.post('/kakao/refresh');
}
function* refresh() {
try {
const result = yield call(refreshAPI);
AsyncStorage.setItem('accesstoken', `${result.data.accessToken}`, () => {});
yield put({
type: REFRESH_SUCCESS,
data: result.data,
});
} catch (err) {
yield put({
type: REFRESH_FAILURE,
error: err.response.data,
});
}
}
保持reducer
status
為 api 調用如下
最初,商店包含的狀態等於初始
所以當一個action
被調用時,如果它已經加載了state,則將狀態設置為加載並且不要調用動作......
注意:我用redux-thunk
方式解釋了這段代碼,但試着理解邏輯,無論在哪里都是一樣的。
我希望你明白
type status = 'initial' | 'loading' | 'success' | 'error';
const initialState = {
status: 'initial'
}
在getPost
錯誤 function 中,您可以檢查 api 的狀態...
const getPost = () => {
return (dispatch, getState) => {
const state = getState();
GETPOST_REQUEST;
try {
GETPOST_SUCCESS;
} catch(error) {
GETPOST_ERROR;
if (state.status !== 'loading') {
dispatch(refresh())
}
}
}
}
const refresh = () => {
return (dispatch, getState) => {
const state = getState();
REFRESH_REQUEST;
try {
REFRESH_SUCCESS;
dispatch(getPost())
} catch(error) {
REFRESH_ERROR;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.