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
相关产品推荐
相关产品推荐

