You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React/Redux中如何优化Dispatch派发逻辑 减少重复代码

代码优化方案

原代码存在的问题

  • 当thingNoErrors存在有效值时,会重复执行2次constants.SUCCESSFUL类型的dispatch操作,以及2次callback回调,属于明显的逻辑bug,会导致状态重复更新、回调重复触发
  • 相同的成功操作逻辑分散在两个分支,后续维护成本高,修改一处就要同步修改另一处

优化思路

把两个分支的差异部分(成功后的payload数据)提前计算,公共的成功操作(dispatch、callback)统一放到分支外执行,彻底消除冗余。

优化后的代码

export const saveThing =
  ({ thingNoErrors = [], thingWithErrors = [], callback = () => {} }) =>
  async (dispatch) => {
    try {
      dispatch({ type: constants.REQUESTING });
      // 初始化成功后返回的默认数据
      let successData = [...thingWithErrors];

      if (thingNoErrors?.length) {
        const formData = new FormData();
        // 原代码用Object.keys遍历数组语义不清晰,直接遍历数组项更合理
        thingNoErrors.forEach(item => {
          if (item?.name && item?.file) {
            formData.append(item.name, item.file);
          }
        });
        const response = await axios.post(`${API_URL}/sample/api`, formData);
        // 合并接口返回数据和错误数据
        successData = [...response.data, ...thingWithErrors];
      }

      // 统一执行成功操作,仅执行一次
      dispatch({
        type: constants.SUCCESSFUL,
        payload: { data: successData }
      });
      callback('success');
    } catch (error) {
      dispatch({ type: constants.ERROR });
      // 若业务需要错误时也触发回调,可在此处补充 callback('error')
    }
  };

优化收益

  • 彻底解决了原代码重复触发成功逻辑的bug
  • 成功后的公共操作仅保留一份,后续修改只需要调整一处,维护成本更低
  • 代码结构更清晰,分支内仅处理差异逻辑,公共逻辑后置统一执行
  • 补充了formData.append前的参数判空,避免传入无效的空字段

内容的提问来源于stack exchange,提问作者Gray Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 11:15:07