Javascript setInterval函数清除自己?

时间:2012-08-23 13:14:24

标签: javascript setinterval clearinterval

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

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

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

编辑:我们假设它在调用clearInterval之前完成了几个时间间隔,这样就不再需要setTimeout。

5 个答案:

答案 0 :(得分:89)

只要您拥有保存的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);
};

答案 1 :(得分:6)

clearInterval(myInterval);

将在您需要时取消Interval。 如果您想在第一次通话后立即取消,请改为setTimeout。确保你可以在Interval函数中调用它。

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

查看EXAMPLE here

答案 2 :(得分:2)

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

答案 3 :(得分: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的答案似乎是最好的答案:)

答案 4 :(得分:1)

你可以通过使用window.setTimeout

的技巧来实现
var Interval = function () {
    if (condition) {
        //do Stuff
    }
    else {
        window.setTimeout(Interval, 20);
    };
};
window.setTimeout(Interval, 20);