以角度优化if语句

时间:2016-07-17 12:34:23

标签: javascript angularjs

我有以下代码,其中有多个' if'声明。

if($scope.level===1){

    $scope.leftWordList=true
    $scope.previewViewRight=true

    $scope.counter1=5
    $timeout($scope.startFilling, 5000)
    $scope.onTimeout = function(){

      $scope.counter1--;
      mytimeout = $timeout($scope.onTimeout,1000);

      if($scope.counter1==0){
        $timeout.cancel(mytimeout);
        $scope.counter=0
      }
    }
    var mytimeout = $timeout($scope.onTimeout,1000); 

  }

  if($scope.level===2){

    console.log("Level 2")

    $scope.leftWordList=true
    $scope.previewViewRight=true

    $scope.counter2=5
    $timeout($scope.startFilling, 5000)
    $scope.onTimeout = function(){

      $scope.counter2--;
      mytimeout = $timeout($scope.onTimeout,1000);

      if($scope.counter2==0){
        $timeout.cancel(mytimeout);
      }
    }
    var mytimeout = $timeout($scope.onTimeout,1000); 
  }
  ....  

$ scope.level 一直持续到7,而且大部分代码都在'除了少数语句之外是相同的,所以我想肯定有优化它的余地,但我不知道如何。

我该怎么做?

更新 删除了问题陈述的错误描述。

3 个答案:

答案 0 :(得分:3)

如果你发现自己有很多相互排斥的分支,那么问题就变成了:分支根本不同,或者是否存在可以考虑的共性?

如果它们根本不同,则会立即想到switch或功能发送表。

但是在你的情况下,它看起来像很多,就像他们使用不同的计数器一样。如果是,请删除您的个人计数器属性(counter1counter2等),并将其替换为您可以编入索引的计数器数组。

然后获取级别(因为如果超时,你想要一个一致的值,而不是在发生超时之前处理它已经改变了)并在整个过程中使用它,请参阅***行:

var level = $scope.level;                      // ***
console.log("Level " + level)                  // ***

$scope.leftWordList = true
$scope.previewViewRight = true

$scope.counters[level] = 5                     // ***
$timeout($scope.startFilling, 5000)
$scope.onTimeout = function() {

    $scope.counters[level]--;                  // ***
    mytimeout = $timeout($scope.onTimeout, 1000);

    if ($scope.counter[level] == 0) {          // ***
        $timeout.cancel(mytimeout);
    }
}
var mytimeout = $timeout($scope.onTimeout, 1000);

请注意,这假设所有此代码都在函数内,因此mytimeoutlevel不与函数的其他调用共享。

答案 1 :(得分:0)

根据给定的代码,如果改变一点,可以使其成为通用代码:

  • 您可以拥有counter个对象,然后根据级别,您可以更新必要的标记。
  • 如果您有适用于大多数情况的任何常用逻辑,请在if之前添加,然后在必要的if中重置。
  • 如果您的计数器已达到0,则不应启动超时,然后将其清除。只需在初始化之前检查条件。
  • 您的函数onTimeoutif中都有类似的签名。尝试使其成为一个功能,而不是在所有if s
  • 中复制它

示例代码:

$scope.counter = {
  counter1: null,
  counter2: null,
}

.
.
.

// if block
$scope.leftWordList = true;
$scope.previewViewRight = true;

$scope.counter["counter" + $scope.level] = 5
$timeout($scope.startFilling, 5000)
var mytimeout = $timeout($scope.onTimeout.bind(this, $scope.counter, $scope.level), 1000);

.
.
.

// Generic function
$scope.onTimeout = function(counter, level) {
  if (--$scope.counter["counter" + level] === 0) 
    mytimeout = $timeout($scope.onTimeout, 1000);
  else
    $scope.counter = 0    
}

注意:我假设您在其他地方设置$scope.counter。因此我在其他条件下重置了它。

答案 2 :(得分:0)

您可以构建一个可以帮助您的对象。

该对象将包含所有不同级别的事物的防御,其余的可以放在" switch-case"

这样的事情:

app.post('/send', function(req,res){
  console.log("Api Req: ",req);
  console.log("Api Res: ",res);
    var mailOptions={
        from : "from@mail.com",
        to : "test@mail.com",
        subject : "Your Subject",
        text : "Your Text",
        html : "HTML GENERATED"
    }
    console.log(mailOptions);
    smtpTransport.sendMail(mailOptions, function(error, response){
        if(error){
            console.log(error);
            res.end("error");
        }else{
            console.log(response.response.toString());
            res.end("sent");
        }
    });
});