如何阻止此 setTimeout 函数运行

How can I stop this setTimeout function from running?

本文关键字:函数 运行 setTimeout 何阻止      更新时间:2023-09-26

我使用以下函数来检查 JSON 文件的状态。它每 8 秒运行一次(使用 setTimeout)以检查文件是否已更改。 一旦 JSON 的状态变为"成功",我就不想再继续调用该函数了。 有人可以告诉我如何做到这一点吗? 我怀疑它涉及使用 clearTimeout,但我不确定如何实现这一点。

干杯!

  $(function() {
    var checkBookStatus = function() {
       var job_id = "#{@job.job_id}";
       var msg = $('.msg');
       var msgBuilding = $('#msg-building');
       var msgQueuing = $('#msg-in-queue');
       var msgSuccessful = $('#msg-successful-build');
       var msgError = $('#msg-error'); 
       $.ajax({ 
         url: '/jobs/'+job_id+'/status.json',
           datatype: 'JSON',
           success:function(data){
             if (data.status == "failure")  {
               msg.hide();          
               msgError.show();
             }
             else if (data.status == "#{Job.queue}")  {
            msg.hide();          
            msgQueuing.show();
         }
             else if (data.status == "#{Job.building}")  {
            msg.hide();          
            msgBuilding.show();
         }             
         else if (data.status == "#{Job.failure}")  {
             msg.hide();          
             msgError.show();
         }
         else if (data.status == "#{Job.success}")  {
             msg.hide();          
             msgSuccessful.show();
              }                    
           },       
       }).always(function () {
            setTimeout(checkBookStatus, 8000);
      });
    };    
   checkBookStatus();    
  });

t = setTimeout(checkBookStatus, 8000);当您决定停止超时时,请使用此clearTimeout(t);

使用clearTimeout

例如,您定义了:

id = setTimeout(checkBookStatus, 8000);  

然后,您可以通过以下方式删除此功能:

clearTimeout(id)

在最后调用checkBookStatus()之前,再打一个电话:var interval = setInterval(checkBookStatus, 8000); 。 然后成功后你可以clearInterval(interval).

不要使用setTimeout进行迭代。

很多答案都建议只使用clearTimeout()但是,您在超时到期后检查状态,没有要清除的超时。 您不需要在 always() 函数中调用 setTimeout(),而不是清除任何内容。 因此,我想您可以重新检查always()函数中的状态,但您的data对象不在那里范围内。 最好只在checkBookStatus()函数之外使用setInterval()

$(function() {
    var checkBookStatus = function() {
        var job_id = "#{@job.job_id}";
        var msg = $('.msg');
        var msgBuilding = $('#msg-building');
        var msgQueuing = $('#msg-in-queue');
        var msgSuccessful = $('#msg-successful-build');
        var msgError = $('#msg-error'); 
        $.ajax({ 
            url: '/jobs/'+job_id+'/status.json',
            datatype: 'JSON',
            success:function(data){
                if (data.status == "failure")  {
                    msg.hide();          
                    msgError.show();
                }
                else if (data.status == "#{Job.queue}")  {
                    msg.hide();          
                    msgQueuing.show();
                }
                else if (data.status == "#{Job.building}")  {
                    msg.hide();          
                    msgBuilding.show();
                }             
                else if (data.status == "#{Job.failure}")  {
                    msg.hide();          
                    msgError.show();
                }
                else if (data.status == "#{Job.success}")  {
                    msg.hide();          
                    msgSuccessful.show();
                    clearInterval(interval);
                }                    
            }       
        });
    };    
    var interval = setInterval(checkBookStatus, 8000);    
    checkBookStatus();
});

使用之前由 setTimeout 返回的值调用clearTimeout。这将为您提供类似以下内容:

$(function() {
  var timeoutID;
  var checkBookStatus = function () {
      […]
      else if (data.status == "#{Job.success}")  {
          clearTimeout(timeoutID);
      […]
       }).always(function () {
        timeoutID = setTimeout(checkBookStatus, 8000);
      […]
<</div> div class="answers">

当你使用 setTimeout 时,像这样使用:

var myTime = setTimeout(checkBookStatus, 8000);

清除它只是:

clearTimeout(myTime);

以下内容应该可以工作...

setTimeout 函数返回 setTimeout 函数的实例。将此值保留在变量中,并在要防止事件再次触发时将其传递给函数 clearTimeout。

    var t = setTimeout(1000, someFunction);
...
//after you no longer need the timeout to fire, call
clearTimeout(t);