在范围内更改值时删除计时器

时间:2017-03-16 21:29:05

标签: javascript angularjs settimeout setinterval clearinterval

我的角度控制中有以下代码

scope.$watch(function(){ return scope.state; }, function() {
    var t1 = scope.state;
        var Interval = setInterval(function(){ Timer() }, 2500);
        if(t1 != "b"){
            clearInterval(Interval);
        }

        function Timer() {
            console.log(t1);
        }
});

我的期望是t1变为" b",计时器应该停止打印。无法理解t1保持打印的原因,就好像清除间隔从未发生过一样。如果这是错的,那么正确的做法是什么。

1 个答案:

答案 0 :(得分:1)

这是因为t1只检查过一次。您可以设置间隔,然后立即设置,您可以看到变量是否为“b”而不是它。如果变量在该瞬间不是“b”,它将永远不会被清除。

再次调用观察者时,您创建一个新间隔并重新运行该检查。如果变量“b”现在,它将终止该间隔,它将不会对上次调用时创建的间隔做任何事情。

你可能想要这样的东西,你只在第一次创建它时创建间隔。

scope.$watch(function() { return scope.state; }, function() {
  var t1 = scope.state;
  if (!scope.myInterval) {  //if there is no interval create it
    function timer() {
      console.log(t1);
    }
    scope.myInterval = setInterval(timer, 2500);
  }
  if (t1 != "b") {
    clearInterval(scope.myInterval);
    //delete scope.myInterval;
  }

});

由于您使用的是角色,因此您应该使用$ interval

而不是范围...

var myInterval;
scope.$watch(function() { return scope.state; }, function() {
  var t1 = scope.state;
  if (!myInterval) {  //if there is no interval create it
    function timer() {
      console.log(t1);
    }
    myInterval= setInterval(timer, 2500);
  }
  if (t1 != "b") {
    clearInterval(myInterval);
    myInterval = null;
  }

});