我怎样才能停止 redux 动作?当我得到错误

How can i stop redux action? when i get error

如果 getPost 函数的 yield 调用(刷新)发生错误,则无论是否发生错误,GETPOST_REQUEST 操作都会继续。

但是,如果在 getPost 函数中发生错误,我不希望该操作再 运行 停止并像

那样结束
    yield put({
          type: REFRESH_FAILURE,
          error: err.response.data,
        });

这是我的代码,我该如何修复?

    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) {
        if (err.response.data === "jwtEx") {
          yield call(refresh);      // if this error i want to stop .

        
          yield put(action);
        } else {
          yield put({
            type: GETPOST_FAILURE,
            error: err.response.data,
          });
        }
      }
    }

    function refreshAPI() {
      // console.log('data::', data);
      return axiosInstace.post("/kakao/refresh");
    }

    function* refresh() {
      try {
        const result = yield call(refreshAPI);
        yield AsyncStorage.setItem(
          "accesstoken",
          `${result.data.accessToken}`,
          () => {
            // console.log('accesstoken 재발급 저장 완료');
            console.log("accesstoken3333333333333333333", result.data.accessToken);
          }
        );
        yield put({
          type: REFRESH_SUCCESS,
          data: result.data,
        });
      } catch (err) {
        console.log("refresh err.response.data:", err.response.data);
        yield put({
          type: REFRESH_FAILURE,
          error: err.response.data,
        });
      }
    }

您可以通过执行以下操作对代码进行小幅更新:

  • return 来自 refresh 生成器函数的 boolean 值。

    boolean 将是:

    • true 如果 refresh 成功
    • false 如果 refresh 失败。
  • yield call(refresh); 设置为 const 声明以捕获此 returned boolean

  • 如果捕获的 boolean 值为 false,请提前 returning

    退出生成器函数

试试下面的代码。

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) {
    if (err.response.data === 'jwtEx') {
      const refreshSuccess = yield call(refresh);
      if (!refreshSuccess) {
        return;
      }

      yield put(action);
    } else {
      yield put({
        type: GETPOST_FAILURE,
        error: err.response.data,
      });
    }
  }
}

function refreshAPI() {
  return axiosInstace.post('/kakao/refresh');
}

/**
 * @returns {boolean} 
 * - `true` if refresh is successful
 * - `false` if refresh failed
 */
function* refresh() {
  let refreshSuccess;
  try {
    const result = yield call(refreshAPI);
    yield AsyncStorage.setItem(
      'accesstoken',
      `${result.data.accessToken}`,
      () => {
        // console.log('accesstoken 재발급 저장 완료');
        console.log('accesstoken3333333333333333333', result.data.accessToken);
      }
    );
    yield put({
      type: REFRESH_SUCCESS,
      data: result.data,
    });
    refreshSuccess = true;
  } catch (err) {
    console.log('refresh err.response.data:', err.response.data);
    yield put({
      type: REFRESH_FAILURE,
      error: err.response.data,
    });
    refreshSuccess = false;
  } finally {
    return refreshSuccess;
  }
}