78
myInterval = setInterval(function(){
     MyFunction();
},50);

function MyFunction()
{
    //Can I call clearInterval(myInterval); in here?
}

间隔没有停止(没有被清除),如果我上面编码的内容很好,那么它将帮助我在别处寻找导致问题的原因。谢谢。

编辑:假设它在调用 clearInterval 之前完成了几个间隔,这消除了对 setTimeout 的需要。

4

5 回答 5

141

只要您对保存的interval变量有范围,就可以从任何地方取消它。

在“子”范围内:

var myInterval = setInterval(function(){
     clearInterval(myInterval);
},50);

在“兄弟”范围内:

var myInterval = setInterval(function(){
     foo();
},50);

var foo = function () {
    clearInterval(myInterval);
};

如果超出范围,您甚至可以通过间隔:

var someScope = function () {
    var myInterval = setInterval(function(){
        foo(myInterval);
    },50);
};

var foo = function (myInterval) {
    clearInterval(myInterval);
};
于 2012-08-23T13:23:23.467 回答
9
clearInterval(myInterval);

将在您需要时取消间隔。如果你想在第一次通话后立即取消,你应该setTimeout取而代之。并且确保您可以在 Interval 函数本身中调用它。

var myInterval = setInterval(function() {
  if (/* condition here */){
        clearInterval(myInterval);
   } 
}, 50);

在此处查看示例

于 2012-08-23T13:16:58.960 回答
3
var interval = setInterval(function() {
  if (condition) clearInterval(interval); // here interval is undefined, but when we call this function it will be defined in this context
}, 50);

或者

var callback = function() { if (condition) clearInterval(interval); }; // here interval is undefined, but when we call this function it will be defined in this context
var interval = setInterval(callback, 50);
于 2012-08-23T13:19:46.563 回答
2

您可以通过使用 window.setTimeout 的技巧来做到这一点

var Interval = function () {
    if (condition) {
        //do Stuff
    }
    else {
        window.setTimeout(Interval, 20);
    };
};
window.setTimeout(Interval, 20);
于 2014-07-26T11:55:02.240 回答
1

从您的代码看来,您想要做的是运行一个函数并一次又一次地运行它,直到完成某些工作......

这实际上是一个任务setTimeout(),方法是类似的:

    var myFunction = function(){
      if( stopCondition ) doSomeStuff(); //(do some stuff and don't run it again)
        else setTimeout( myFunction, 50 );
    }
    myFunction(); //immediate first run 

就那么简单 :)

当然,如果你真的想使用 setInterval 出于某种原因,@jbabey 的答案似乎是最好的:)

于 2014-06-29T16:33:05.163 回答