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

Javascript 清除一个超时,启动另一个超时,javascript,jquery,settimeout,Javascript,Jquery,Settimeout,我正在使用ajax/json自动刷新站点上的内容。使用jkey,我会触发一些对文档的发布,在此过程中,我想取消正在运行的原始setTimeout(“2分钟重新加载”),然后再次触发整个函数“content”,在5秒后重新启动。然而,我似乎无法正确地停止“重新加载”,也无法在给定的秒数后调用“内容”。有人能发现错误吗 <script> $(function content(){ function reloading(){ $.ajax({

我正在使用ajax/json自动刷新站点上的内容。使用jkey,我会触发一些对文档的发布,在此过程中,我想取消正在运行的原始setTimeout(“2分钟重新加载”),然后再次触发整个函数“content”,在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>

$(函数内容(){
函数重载(){
$.ajax({
url:'api.php',
数据:“,
数据类型:“json”,
成功:功能(数据)
{
变量id=数据[0];
_id=id;
var vname=数据[1];
var消息=数据[2];
var时间戳=数据[3];
变量字段1=数据[4];
_field1=field1;
var val2=parseInt(字段1,10);
_val2=val2;
$('#output').hide().html(message.fadeIn(“慢”);
$('#username').hide().html(vname+“:”).fadeIn(“慢”);
设置超时(重新加载,120000);
}
});
}
重新加载();
}); 
$(document).jkey('a',function(){
$.post(“update.php”,{“id”:\u id})
$('#output').hide().html(“thx”).fadeIn(“slow”);
$(“#用户名”).fadeOut(“快速”);
$('valg1')。淡出(“快速”);
$('valg2')。淡出(“快速”);
清除超时(重新加载);
设置超时(内容,5000);
});

您必须保存
设置超时()
id,以便以后使用
清除超时()
清除它。像这样:

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

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

window["reload_timer"] = setTimeout(reloading,120000);
那么就有这个,

clearTimeout(window["reload_timer"]);

除了像其他帖子中提到的那样保存超时id外,您的
函数重新加载
是在
函数内容
中创建的,因为您没有对它创建闭包,所以程序的其余部分无法访问它

$(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秒后被调用,只要
重新加载
成功,它将每隔120秒进行一次回调。请注意,
重新加载
永远不会以这种方式清除。

现在,这就像一个符咒!现在的最后一个问题是在5秒后再次调用函数“content”。我尝试了同样的方法,但没有结果。我在这里遗漏了什么?再次调用
内容
毫无意义-它所做的唯一事情就是调用
重新加载
函数,该函数已经在AJAX回调中再次调用了自己。我想这样做,但我似乎无法实现这一点。不过有一件事,难道不可能只调用整个“内容”吗?只要确保jkey函数可以访问它就行了?这是可行的,但每次都会创建一个新的
重载
函数,一旦退出作用域就将其丢弃。如果要停止重新加载,应调用
clearTimeout(reloadingTimeoutId)
。如果
content
包含的代码不比我的示例中的代码多,您可以直接从
jkey(…
内部调用重载。