javascript - 我怎样才能停止 redux Action ?当我出错时

标签 javascript reactjs redux react-redux redux-saga

如果在 getPost 函数的 yield call(refresh) 中发生错误,则无论是否发生错误,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,
        });
      }
    }

最佳答案

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

  • 返回 boolean您的值(value) refresh生成器函数。boolean将是:
  • true如果 refresh成功
  • false如果 refresh失败的。

  • 套装yield call(refresh);const捕获此返回的声明 boolean值(value)
  • 如果这被捕获 boolean值为 false , 通过 return 退出生成器函数提早

  • 试试下面的代码。
    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;
      }
    }
    

    关于javascript - 我怎样才能停止 redux Action ?当我出错时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67475066/

    相关文章:

    javascript - 使用 ImmutableJs 清空数组

    javascript - 如何使用 Typescript + react-leaflet 创建 GeoJSON Feature 元素

    javascript - 如何在mysql中成功插入数据后显示警告框?

    javascript - jquery自定义文件输入插件

    javascript - 递归调用 Promise 函数

    javascript - 直接在 render 函数中使用 React.forwardRef

    javascript - 使用带有 BeautifulSoup 的 React JS 渲染的抓取元素

    javascript - 使用项目组中的 React Native State 管理选定的项目样式

    javascript - 在 API 请求的客户端应用程序中存储用户 ID

    reactjs - 如何在react-redux中实现过滤或搜索?