Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的SetTimeout和clearTimeout_Javascript_Settimeout - Fatal编程技术网

Javascript中的SetTimeout和clearTimeout

Javascript中的SetTimeout和clearTimeout,javascript,settimeout,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(dis

我编写了这个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>

var disableReload='';
var tId=window.setTimeout(函数(){
位置。重新加载(true);
//警报(禁用重新加载);
如果(禁用重新加载){
//警报(“清算”);
清除超时(tId);
}否则{
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',参数:params,onComplete:showResponseAction});
}
}, 15 * 1000);
但当disableReload为真时;clearTimeout不是清除/删除重新加载功能


我怎样才能做到这一点。

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

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

因为,查看您的代码,您的页面似乎在调用clearTimeout之前得到刷新。

我不知道您在这里期望发生什么

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

clearTimeout的要点是停止运行超时,以便不调用已注册的闭包。如果(且仅当)超时刚刚触发,则调用它不会有任何效果

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


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

  • 无论何时设置
    disableReload=true
    ,请调用
    clearTimeout(tId)
    。只要
    tId
    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
    变量是静态的(不再写入)。如果这是真的,那么为什么要首先设置超时?调用ajax后,只需将整个
    var tId=window.setTimeout…
    包装在
    if(!disableReload)

    中,根据响应我正在更改它的值。太长的条件和代码不会影响这一点。所以我没有发布part@NitinGurram那是在你已经在被延迟的函数中之后。您没有使用
    setInterval
    ,因此它不会重复。在该阶段,您只需从
    函数
    返回
    。您还将在函数开始处重新加载页面,该函数将重置所有内容。哎呀。。我是js的新手,通过谷歌学习。你能根据我的要求为这个案例编写js代码吗。我将学习:)我认为您需要删除
    位置。重新加载(true)
    ,将
    窗口更改为
    窗口。setTimeout
    (这一个重复),然后您应该能够像现在一样使用函数,但使用
    clearInterval
    而不是
    clearTimeout
    。是的。我的要求是每1分钟调用一个ajax函数(比方说)。但是我应该能够基于disableReload变量禁用这个。所有这些事情都应该在没有任何按钮点击或其他基于用户的操作的情况下发生我看到了-我已经根据您的评论更新了我的答案,因为听起来你根本不需要取消超时。@NitinGurram我仍然不明白你为什么要做一个
    定位。在AJAX请求的同时重新加载
    。你错过了一些代码吗。我能看出情况是否有点不对劲。在其他部分。位置。重新加载(true)将重新加载页面right@NitinGurram是的,我从你的代码中复制了这个。正如我所说,我试图通过阅读代码来理解您的目标,因为问题不是很清楚。我的要求是每1分钟调用一个ajax函数(比方说)。但是我应该能够基于disableReload变量禁用这个。所有这些事情都应该在没有任何按钮点击或其他基于用户的操作的情况下发生operations@NitinGurram理解。我已经更新了我的答案。您只需以某种方式切换“disableReload”变量以停止重复。希望有帮助!