清除一个超时,启动另一个

时间:2011-10-24 11:07:13

标签: javascript jquery settimeout

我使用ajax / json自动刷新网站上的内容。使用jkey,我触发一些帖子到文档,在这个动作中我想取消正在运行的原始setTimeout(“重新加载”2分钟) - 然后再次触发整个功能“内容”以在5秒后重新开始。但是,我似乎无法正常停止“重新加载”,在给定的秒数后也不会调用“内容”。有人能发现错误吗?

 <script>
$(function content(){
  function reloading(){
      $.ajax({                                      
      url: 'api.php',                          
      data: "",                      
      dataType: 'json',                    
      success: function(data)          
      {
        var id = data[0];              
          _id = id;
        var vname = data[1];           
        var message = data[2]; 
        var timestamp = data[3]; 
        var field1 = data[4]; 
        _field1 = field1;
        var val2 = parseInt(field1, 10) ;
        _val2 = val2;
        $('#output').hide().html( message ).fadeIn("slow");   
         $('#username').hide().html( vname +":" ).fadeIn("slow");
      setTimeout(reloading,120000);
 }
      });
  }
  reloading();
}); 

  $(document).jkey('a',function() {
     $.post("update.php", { "id": _id} )
      $('#output').hide().html( "<i>thx" ).fadeIn("slow");
      $('#username').fadeOut("fast");
      $('#valg1').fadeOut("fast");
      $('#valg2').fadeOut("fast");
        clearTimeout(reloading);
       setTimeout(content,5000);
      });
</script>

3 个答案:

答案 0 :(得分:3)

您必须保存setTimeout() ID,以便稍后使用clearTimeout()清除它。像这样:

var timeoutID = setTimeout(function(){someFunction()}, 5000);//this will set time out
//do stuff here ...
clearTimeout(timeoutID);//this will clear the timeout - you must pass the timeoutID

答案 1 :(得分:3)

clearTimeout应该获得setTimeout返回的唯一“密钥”。因此,在设置时,将返回值分配给全局变量:

window["reload_timer"] = setTimeout(reloading,120000);

然后有这个:

clearTimeout(window["reload_timer"]);

答案 2 :(得分:0)

除了保存其他帖子中提到的超时ID之外,function reloading是在function content内创建的,因为你没有创建任何关闭,所以它无法从程序的其余部分访问。

$(function content(){
    function reloading(){
        console.log('RELOADING');
    }
    reloading();
}); 

// Can't reach `content` or `reloading` from here

你必须做这样的事情:

var reloading, content, reloadingTimeoutId, contentTimeoutId;


reloading = function () {
    console.log('RELOADING');
    $.ajax(
       // CODE
       success : function (data) {
           // CODE
           reloadingTimeoutId = setTimeout(reloading, 120000);
       }
    )
};


content = function () {
    reloading();
};


$(document).jkey('a',function() {
    // CODE
    clearTimeout(contentTimeoutId);
    contentTimeoutId = setTimeout(content,5000);
});

如果不了解更大的图片,那就更难写了。这样,content将在5秒后被调用,只要reloading成功,它将每120秒回调一次。请注意reloading永远不会以这种方式清除。