2013-07-30 36 views
2

我有这样的循环,工作好:如何杀死一个javascript的setTimeout循环

function countdown(counter) { 
    x = counter; 
    if (x > 0) { 
     x--; 
     alert(x + "/5"); 
     if (x > 0) { 
      setTimeout(function() { 
       countdown(x); 
      }, 500); 
     } 
    } 
}; 

countdown(6); 

但我希望能够杀死它,并通过按下一个按钮,再次启动它。我想重新启动循环,而不管当我按下按钮时它打开的是什么号码。

我在过去的几个小时里无处可去。

这里有一个的jsfiddle:http://jsfiddle.net/4vtPH/4/

+1

全局状态似乎是唯一的答案。 – Ven

+1

在某处保存'setTimeout'的返回值。调用'clearTimeout',然后重新调用'countdown(6);'。 –

+0

不确定,但setInterval在你的情况下可能会更好? https://developer.mozilla.org/en-US/docs/Web/API/window.setInterval它也有一个类似于超时的清晰方法 – house9

回答

6

您可以使用clearTimeout(documentation)

var timeout; 
function countdown(counter) { 
    x = counter; 
    if (x > 0) { 
     x--; 
     alert(x + "/5"); 
     if (x > 0) { 
      timeout = setTimeout(function() { 
       countdown(x); 
      }, 2000); 
     } 
    } 
}; 
$('input').click(function() { 
    clearTimeout(timeout); 
    countdown(6); 
}); 
countdown(6); 

Fiddle

0

首先,您需要将setTimeout分配给一个变量。

var timeout = setTimeout(.. 

然后在需要时您可以使用clearTimeout(timeout)。确保您的超时变量的范围是可以在需要访问它的任何地方访问的。

0

如何使用间隔进行倒计时?以下是替代解决方案(DEMO):

function Countdown(counter) { 
    this.interval = 0; 
    this.x = counter; 
    console.log(this.x + "/"+counter); 
    this.start = function() { 
     var self = this; 
     this.interval = setInterval(function() { 
      self.x--; 
      console.log(self.x + "/"+counter); 
      if(self.x == 0) self.stop(); 
     }, 2000); 
    }; 

    this.stop = function() { 
     clearInterval(this.interval); 
    }; 
}; 

var c = new Countdown(7); 
c.start(); 

var c2 = new Countdown(4); 

c2.start();