4

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

6 回答 6

5

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

于 2012-04-30T07:52:39.287 回答
4

采用clearTimeout

例如,您定义:

id = setTimeout(checkBookStatus, 8000);  

那么您可以通过以下方式删除此功能:

clearTimeout(id)
于 2012-04-30T07:53:38.240 回答
2

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

$(function() {
  var timeoutID;
  var checkBookStatus = function () {
      […]
      else if (data.status == "#{Job.success}")  {
          clearTimeout(timeoutID);
      […]
       }).always(function () {
        timeoutID = setTimeout(checkBookStatus, 8000);
      […]
于 2012-04-30T07:52:16.740 回答
2

使用时setTimeout,请像这样使用:

var myTime = setTimeout(checkBookStatus, 8000);

清除它:

clearTimeout(myTime);
于 2012-04-30T07:53:13.103 回答
2

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

不要setTimeout用于迭代。

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

$(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();
});
于 2012-04-30T07:55:54.840 回答
0

以下应该工作......

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

IE

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

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

clearTimeout(t);
于 2012-04-30T07:56:27.440 回答