簡體   English   中英

如何停止運行此setTimeout函數?

[英]How can I stop this setTimeout function from running?

我使用下面的函數來檢查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)

使用setTimeout先前返回的值調用clearTimeout 這會給你一些類似的東西:

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

使用setTimeout ,請使用如下:

var myTime = setTimeout(checkBookStatus, 8000);

清除它只是:

clearTimeout(myTime);

在最后調用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函數返回setTimeout函數的一個實例。 將此值保存在變量中,並在希望防止事件再次觸發時將其傳遞給函數clearTimeout。

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

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

clearTimeout(t);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM