Javascript中的SetTimeout和clearTimeout

时间:2012-09-10 09:38:44

标签: javascript settimeout

我已经编写了这个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没有清除/删除重载功能。

我怎样才能做到这一点。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

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

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


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

  1. 每当您设置disableReload = true时,请致电clearTimeout(tId)。只要tId具有与disableReload相同的范围/可见性,这应该可以作为替代品。
  2. 更改超时功能的逻辑,以便重新加载本身以disableReload
  3. 为条件

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

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

    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为真,那么当超时闭包触发时没有任何反应。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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);