1

我想执行一段任意代码并能够随时停止它。我想我可以这样做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)

现在一种方法是控制正在执行的代码,并使其将任何额外超时的值存储到一个全局变量中,并一次将它们全部清除。但是有没有更好的方法来做到这一点?有没有办法在任意代码上做到这一点?

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

4

3 回答 3

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);
于 2013-08-26T04:12:54.293 回答
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  = [];
于 2013-08-26T04:16:22.283 回答
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 秒才能运行。

于 2013-08-26T04:24:30.277 回答