我有以下代码,其中有多个' 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,而且大部分代码都在'除了少数语句之外是相同的,所以我想肯定有优化它的余地,但我不知道如何。
我该怎么做?
更新 删除了问题陈述的错误描述。
答案 0 :(得分:3)
如果你发现自己有很多相互排斥的分支,那么问题就变成了:分支根本不同,或者是否存在可以考虑的共性?
如果它们根本不同,则会立即想到switch
或功能发送表。
但是在你的情况下,它看起来像很多,就像他们使用不同的计数器一样。如果是,请删除您的个人计数器属性(counter1
,counter2
等),并将其替换为您可以编入索引的计数器数组。
然后获取级别(因为如果超时,你想要一个一致的值,而不是在发生超时之前处理它已经改变了)并在整个过程中使用它,请参阅***
行:
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);
请注意,这假设所有此代码都在函数内,因此mytimeout
和level
不与函数的其他调用共享。
答案 1 :(得分:0)
根据给定的代码,如果改变一点,可以使其成为通用代码:
counter
个对象,然后根据级别,您可以更新必要的标记。if
之前添加,然后在必要的if
中重置。 0
,则不应启动超时,然后将其清除。只需在初始化之前检查条件。onTimeout
在if
中都有类似的签名。尝试使其成为一个功能,而不是在所有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");
}
});
});