繁体   English   中英

Javascript中的SetTimeout和clearTimeout

[英]SetTimeout and clearTimeout in Javascript

我已经编写了这个js函数,用于每隔15秒调用ajax。 但它应该根据其他条件限制

 <script type="text/javascript">
  var disableReload = '<s:property value="#session[\'EXECUTOR\'] == null" />';
  var tId = window.setTimeout(function () { 
    location.reload(true);
   //alert(disableReload);
   if(disableReload){
       //alert("Clearing");
       clearTimeout(tId);
   }else{
    var url = 'my.action';
    var form = document.getElementById('myForm');
    var params = Form.serialize(form) + '&ms=' +  new Date().getTime();
    var myAjax = new Ajax.Request(url, {method: 'post', parameters: params, onComplete: showResponseAction} );
   }
 }, 15 * 1000);
</script>

但是当disableReload为true时; clearTimeout不清除/删除重载功能。

我怎样才能做到这一点。

因为,查看您的代码,看起来您的页面在调用clearTimeout之前会刷新。

我不知道你期待在这里发生什么。

您正在超时函数中调用clearTimeout方法 - 也就是说,只有在超时已经过去并且运行闭包时才会调用该代码。

clearTimeout的目的是停止运行超时,以便不调用已注册的闭包。 如果(并且仅当)超时刚刚触发时调用它将无法实现任何目标。

我只能建议您再次考虑在什么条件下要取消挂起的重新加载 - 并重新排列代码,以便在触发这些情况时调用clearTimeout ,而不是重新加载已经发生之后。


编辑:啊,似乎你不一定要取消超时本身,而是想要根据变量的结果禁用重载。 我有几种方法可以做到这一点:

  1. 无论何时设置disableReload = trueclearTimeout(tId)调用clearTimeout(tId) 只要tId具有与disableReload相同的范围/可见性,这应该可以作为替代品。
  2. 更改超时函数的逻辑,以便重新加载本身以disableReload为条件。

前者可能是最干净的选择 - 保持超时运行没有什么意义,你知道什么都不做,而且它还避免了在超时过去之前将disableReload设置为false会发生什么的问题。

但后者对现有代码的改动较小,可能更容易掌握:

window.setTimeout(function () { 
   if (!disableReload) {
      location.reload(true); 

      // I think these are dependent on the disableReload variable too?
      // If not you can move them outside the if block
      var url = 'my.action';
      var form = document.getElementById('myForm');
      var params = Form.serialize(form) + '&ms=' +  new Date().getTime();
      var myAjax = new Ajax.Request(url, {method: 'post', parameters: params, onComplete: showResponseAction} );
   }
}, 15 * 1000);

这样,如果disableReload为true,则在超时闭包触发时没有任何反应。

看起来你的disableReload变量是静态的(永远不会再写入)。 如果这是真的,为什么要首先设置超时? 只需将整个var tId = window.setTimeout...包装在if (!disableReload)

如果我理解你的意图,那么你需要的是这样的东西:

var disableReload = false; // toggle this to false, on AJAX response(?) to stop repeats

var repeat = function()
{
    if(disableReload) 
    {
       clearInterval(intervalID);
    }
    else
    {
       var url = 'my.action';
       var form = document.getElementById('myForm');
       var params = Form.serialize(form) + '&ms=' +  new Date().getTime();
       var myAjax = new Ajax.Request(url, {method: 'post', parameters: params, onComplete: showResponseAction} );
    }
}

var intervalID = window.setInterval(repeat, 1000);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM