4

以下の関数を使用して、JSON ファイルのステータスを確認します。ファイルが変更されたかどうかを確認するために、(setTimeout を使用して) 8 秒ごとに実行されます。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);タイムアウトを停止する場合は、これを使用しますclearTimeout(t);

于 2012-04-30T07:52:39.287 に答える
4

使用するclearTimeout

たとえば、次のように定義しました:

id = setTimeout(checkBookStatus, 8000);  

次に、次の方法でこの機能を削除できます。

clearTimeout(id)
于 2012-04-30T07:53:38.240 に答える
2

最後にの呼び出しの前に、checkBookStatus()別の呼び出しを置きます: var interval = setInterval(checkBookStatus, 8000);。その後、成功するとできclearInterval(interval)ます。

setTimeout反復には使用しないでください。

多くの回答が使用することを示唆していclearTimeout()ますが、タイムアウトが経過した後にステータスを確認しているため、クリアするタイムアウトはありません。何かをクリアするのではなくsetTimeout()、関数を呼び出す必要はありません。したがって、関数always()内のステータスを再検査できますが、オブジェクトはスコープ内にありません。関数の外で使用することをお勧めします。always()datasetInterval() 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 に答える
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 に答える
0

以下はうまくいくはずです...

setTimeout 関数は setTimeout 関数のインスタンスを返します。この値を変数に保持し、イベントが再び発生するのを防ぎたい場合は、関数 clearTimeout に渡します。

すなわち

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

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

clearTimeout(t);
于 2012-04-30T07:56:27.440 に答える