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

AngularJS代码重构问询:如何消除if-else分支重复代码?

嘿,我看到你在重构这段AngularJS下拉触发的重复代码时踩了坑,咱们来把问题捋清楚,然后给出能正常工作的重构方案~

问题出在哪?

你提取公共逻辑的思路完全没问题,但重构代码里有两个关键错误导致功能失效:

  • 错误1:传递方法名时没加引号
    你调用$scope.callresource(searchItemSalesInfo)的时候,searchItemSalesInfo会被JS当成一个变量去查找,但它其实是$scope.resource对象上的属性名,应该传字符串'searchItemSalesInfo'才对。
  • 错误2:访问动态属性时用了点语法
    在callresource函数里,$scope.resource.resourcename会去查找resource对象上名为resourcename的属性,而不是你传进来的变量对应的属性。JS里访问动态属性必须用方括号语法:$scope.resource[resourcename]。

正确的重构代码

咱们把这两个问题修正,再把重复的回调函数也提取出来,让代码更整洁:

// 提取重复的响应处理逻辑
const processResponse = function(response, headers) {
  angular.forEach(response, function(row, id) {
    response[id].prod_info = `${row.alias} (${row.final_product_id})`;
  });
  $scope.totalCount = headers('x-total-count');
};

// 封装资源调用的公共逻辑
$scope.callResource = function(resourceName) {
  // 用方括号访问动态属性,注意:$resource返回的是异步promise,外部使用需注意异步时机
  return $scope.resource[resourceName](params.get, params.post, processResponse);
};

// 业务逻辑判断与调用
if (1 === $scope.form.type) {
  $scope.callResource('searchItemSalesInfo');
} else {
  $scope.callResource('searchOrderSalesInfo');
}

额外优化提示

  • 把回调函数单独提取后,后续修改响应处理逻辑只需改动这一处,维护性更高;
  • 用ES6模板字符串${}替代传统字符串拼接,代码可读性更好;
  • 调整了函数名的驼峰式命名(callResource替代callresource),更符合JS编码规范;
  • 注意$resource的请求是异步的,如果外部需要用到返回的response,建议通过.then()方法处理异步结果。

内容的提问来源于stack exchange,提问作者5eeker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 09:01:40