计时器不会死javascript

时间:2013-01-07 21:11:16

标签: javascript jquery setinterval long-polling

我正在进行一些长轮询...我有一个函数可以在某个语句为真时使按钮闪烁。这是:

function blinking(object, x) {

    console.log(x);

    if(x>0){

        var existing_timer = object.data('clock');
        if (existing_timer){
            clearInterval(existing_timer);
        }

        timer = setInterval(blink, 10);

        function blink() {
            object.fadeOut(400, function() {
               object.fadeIn(400);
            });
        }

    }

}

现在..注意计时器被设置为'计时器'。当有人做了使语句失败的事情(使x = 0)时,我希望计时器在看到x = 0时停止使按钮闪烁。这可能听起来很容易,但我已经尝试了所有的事情。

我一直在研究和尝试不同的事情,但它似乎没有用。

2 个答案:

答案 0 :(得分:1)

如果你的变量计时器是全局的,那么你应该能够使用它来清除间隔:

clearInterval(timer);

setInterval返回的整数对于该计时器是唯一的,因此您需要清除它。

答案 1 :(得分:0)

这是一个简单的实现。

http://jsfiddle.net/AQgBc/

var $led = $('#led'),
    blinkState = 0,
    blinkTimer,
    blinkDuration = 300,
    blink = function () {
      if (blinkState) {
        $led.toggleClass('on');
      }
      console.log('blink');
      blinkTimer = setTimeout(blink, blinkDuration);     
    };

$('button').on('click', function () {
  blinkState = (blinkState) ? 0 : 1;
});

blink();

我只是编写了自己的内容而没有重复你的内容,但我认为最相关的问题是使用setTimeout而不是担心setInterval并清除该间隔。

编辑以回复评论:

如果您希望它在用户操作之前闪烁,然后停止轮询,则更简单。

http://jsfiddle.net/AQgBc/1/

var $led = $('#led'),
    blinkState = 1,
    blinkTimer,
    blinkDuration = 300,
    blink = function () {
      if (blinkState) {
        console.log('blink');
        $led.toggleClass('on');

        blinkTimer = setTimeout(blink, blinkDuration);
      }   
    };

$('button').on('click', function () {
  blinkState = (blinkState) ? 0 : 1;
});

blink();