如何停止运行此setTimeout函数?

时间:2012-04-30 07:49:38

标签: javascript jquery

我使用下面的函数检查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();    
  });

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

使用clearTimeout

e.g。你定义了:

id = setTimeout(checkBookStatus, 8000);  

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

clearTimeout(id)

答案 2 :(得分:2)

使用clearTimeout之前返回的值调用setTimeout。这会给你类似的东西:

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

答案 3 :(得分:2)

使用setTimeout时,请按照以下方式使用:

var myTime = setTimeout(checkBookStatus, 8000);

清除它:

clearTimeout(myTime);

答案 4 :(得分:2)

在最后致电checkBookStatus()之前,请拨打另一个电话:var interval = setInterval(checkBookStatus, 8000);。然后,您可以成功clearInterval(interval)

不要使用setTimeout进行迭代。

很多答案建议只使用clearTimeout()但是,您在超时过期后检查状态,没有超时要清除。您无需在setTimeout()功能中调用always(),也不需要清除任何内容。因此,您可以重新检查我认为的always()函数中的状态,但是您的data对象不在那里。最好只使用setInterval()函数的<{1}}

checkBookStatus()

答案 5 :(得分:0)

以下应该有效...

setTimeout函数返回setTimeout函数的一个实例。如果要阻止事件再次触发,请将此值保存在变量中并将其传递给函数clearTimeout。

    var t = setTimeout(1000, someFunction);
...

//after you no longer need the timeout to fire, call

clearTimeout(t);