Javascript 在范围中的值发生更改时删除计时器

Javascript 在范围中的值发生更改时删除计时器,javascript,angularjs,settimeout,setinterval,clearinterval,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); } functi

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

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一直打印,好像从未发生过清除间隔。如果这是错误的,那么正确的方法是什么。

这是因为
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;
  }

});
既然您使用的是angular,那么您可能应该使用他们的$

而且不在范围之内

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;
  }

});

因为t1只检查一次。。。设置间隔,然后在设置间隔后立即查看变量是否为“b”,然后再确定。如果变量在那一刻不是“b”,它将永远不会被清除。但我在手表中有我的函数,我想t1!=当scope.state的$watch变为“b”时,将验证“b”。请阅读下面我的回答,其中我添加了更多关于正在发生的事情的详细信息。我试图在scope上设置标志并克服此问题,但在scope上定义函数是clearInterval需要使用的方法,而不是该实例。尽管我有一个想法,因为它是新的间隔无法克服它。在作用域上声明是诀窍。它可以是外部定义的局部变量,不需要是作用域的一部分。