在Javascript中停止嵌套超时

时间:2013-08-26 04:09:24

标签: javascript settimeout

我想执行一段任意代码,并且能够随时停止它。我想我可以使用setTimeout执行此操作,然后使用clearTimeout来阻止它。但是,如果超时中的代码创建了自己的超时,那么即使在我清除原始文件后,这些代码也会继续执行。

示例:

var timeoutID = setTimeout(
    function(){
        console.log("first event can be stopped with clearTimout(timeoutID)");
        setTimeout(function(){console.log("but not this one")}, 5000)
    }, 5000)

现在一种方法是控制正在执行的代码并使其将任何其他超时的值存储到全局变量中并立即清除它们。但是有更好的方法吗?有没有办法在任意代码上执行此操作?

为了澄清,我试图能够执行我想要的任何功能,然后随时停止它,即使该功能包含超时

3 个答案:

答案 0 :(得分:3)

您也可以将内部超时放入变量中:

var innerTimeout,
    timeoutID = setTimeout(
    function(){
        console.log("first event can be stopped with clearTimout(timeoutID)");
        innerTimeout = setTimeout(function(){console.log("but not this one")}, 5000);
    }, 5000);

答案 1 :(得分:1)

您必须创建一个超时ID数组,例如:

var timeoutIds = [];

timeoutIds.push(setTimeout(
  function(){
    console.log("first event can be stopped with clearTimout(timeoutID)");
    timeoutIds.push(setTimeout(function(){console.log("but not this one")}, 5000));
 }, 5000))

然后澄清:

for (int i = 0; i < timeoutIds.length; i++)
{
   clearTimeout(timeoutIds[i]);
}

timeoutIds  = [];

答案 2 :(得分:0)

您可以将超时包装在对象中,或者在第二次超时时重新使用timeoutID。

包裹一个物体:

function Timer(){
  var me=this;
  this.currentTimerID=setTimeout(function(){
    console.log("First timeout");
    me.currentTimerID=setTimeout(function(){
      console.log("Second timeout");
    },100);
  },100);
};
Timer.prototype.cancel=function(){
  clearTimeout(this.currentTimerID);
};

var t = new Timer();//let this run it's course
setTimeout(function(){t = new Timer()},250);//start timer again
setTimeout(function(){t.cancel();},400);// cancel it after the first timeout

重新使用timeoutID:

var timeoutID = setTimeout(
    function(){
        console.log("first event can be stopped with clearTimout(timeoutID)");
        timeoutID=setTimeout(function(){console.log("but not this one")}, 100)
    }, 100)
setTimeout(function(){
  clearTimeout(timeoutID);
},150);// will not execute the second timeout

一个提示:如果您使用超时测试代码,请不要使用如此高的值,因为原始代码运行需要10秒。