2012-04-30 83 views
4

我使用下面的函數來檢查JSON文件的狀態。它每8秒運行一次(使用setTimeout)來檢查文件是否已更改。一旦JSON的狀態變成'成功',我不再想繼續調用這個函數。有人可以告訴我如何做到這一點?我懷疑它涉及使用clearTimeout,但我不確定如何實現這一點。如何停止運行setTimeout函數?

乾杯!

$(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();  
    }); 

回答

2

您的checkBookStatus()呼叫之前,把另一個電話:

id = setTimeout(checkBookStatus, 8000); 

,那麼你可以通過刪除此功能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(); 
}); 
+1

謝謝你李:) – swisstony

2

呼叫clearTimeout與價值以前setTimeout返回。當你決定停止超時使用此clearTimeout(t);

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

t = setTimeout(checkBookStatus, 8000);:這會給你的東西等。

+0

確保它是'T = setTimeout的(...)''不VAR 噸= setTimeout的(...)''的t'必須設置爲全局變量。 –

+0

如何清除尚未設置的超時? –

+0

超時將調用checkBookStatus函數,清除必須在checkBookStatus函數內部,很明顯清除超時不會發生,除非該函數被稱爲「已經調用」,爲什麼他會要求停止它,如果它沒有被調用然而? –

2

當您使用setTimeout,使用這樣的:

var myTime = setTimeout(checkBookStatus, 8000); 

只是清除它:

clearTimeout(myTime); 
4

使用clearTimeout

例如你定義:年底

clearTimeout(id) 
0

以下應該工作...

的setTimeout函數返回setTimeout函數的一個實例。如果要防止事件再次觸發,請將此值保存在變量中並傳遞給函數clearTimeout。

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

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

clearTimeout(t);