簡體   English   中英

如何避免多次請求 redox-saga 操作?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM