2012-01-06 11 views
0

ボタンをクリックしたときに関数を呼び出すためにjQueryを使用しています。この関数はPHPで呼び出され、ロギング情報を返します。私はsetInterval()を使用しようとしましたが、私が選択した速度で関数を呼び出し、重複するロギング情報を返す傾向があり、ほとんどの場合はフリーズします。 jQueryからPHP関数を繰り返し呼び出す方法はありますが、最後の呼び出しが終了して返された後に関数を呼び出すだけですか?jQueryのsetIntervalの代替手段は何ですか?

はここで作るjQueryのコードはここsetInterval()

setInterval(
      function(){ 
       $.getJSON("ajax.php?function=tail&pointer=" + ftell, 
        function(data){ 
         var obj = []; 
         obj = $.parseJSON(data); 

         ftell = obj[0]; 
         $("#tail").append(obj[1]); 
        }); 
      }, 2000); 

を含み、それはAJAX呼び出しのコールバック関数に

function tail(){ 
    $file = "/path/to/the/log/file.log"; 
    $handle = fopen($file, "r"); 
    clearstatcache(); 

    $currentSize = filesize($file);    
    $offset = $_REQUEST['pointer'] - $currentSize; 

    if ($_REQUEST['pointer'] == 0) { 
     fseek($handle, -1024, SEEK_END); 
    } else { 
     fseek($handle, $_REQUEST['pointer'], SEEK_END); 
    } 

    while ($buffer = fgets($handle)) { 
     $log .= $buffer . "<br />"; 
    } 

    fclose($handle);  
    $results = array('0' => $currentSize, '1' => str_replace('"', '\"', $log));  
    echo json_encode($results); 
} 
+0

再帰的コールバック。 – zzzzBov

+1

見るべきいくつかのコードが役に立ちます。 – j08691

答えて

2

これは、最初のイベントが完了してから5秒後に別のajaxイベントをトリガーします。それが成功したか失敗したかは問題ではありません。このようなコードを書くと

function checkForUpdates() { 
    var delay = 5000; //in milliseconds, so 5s 
    setTimeout(function() { 
    $.ajax(...).always(checkForUpdates); 
    }, delay); 
} 

いくつかの懸念は、それがキャンセルするためのメカニズムが含まれていないことをすることができます。

1

setTimeoutを使用を呼び出すPHP関数です。

setTimeoutはスクリプトを1回だけ実行し、コールバック関数にこれを配置すると、ajax呼び出しに別のカウントダウンタイマーを作成する前にajax呼び出しが完了していることが保証されます。

0

jQueryのajax呼び出しのステータスを保持するグローバル変数を設定できます。これをnullに初期化します。 jQueryのajaxの成功ハンドラで、完了するように設定します。次に、設定した間隔でこのコードを呼び出す前に、変数の値を確認します。それが完了したら、jquery ajaxを使用してPHPページを呼び出すコードを実行し続けます。

var globalAjaxResponseStatus=""; 
var int=self.setInterval("CheckData()",1000); 

function CheckData() 
{ 
    if(globalAjaxResponseStatus=="completed") 
    { 
    globalAjaxResponseStatus="" 
    $.ajax({ 
      url: "checkdata.php", 
      success: function(data){ 
       globalAjaxResponseStatus="completed" 
       //Do what you want with the response 
      } 
      }); 

    } 

} 
1

好きなようなサウンドは、AJAX呼び出しが正常に返されたときに再帰的に呼び出すことです。あなたは明らかに、その関数の最初の呼び出しを処理する必要があると思います

function foo() { 
    $.ajax({ 
     url: 'url', 
     data: { 
      // data 
     }, 
     success: function(data) { 
      // do stuff with data 
      foo(); 
     } 
    }); 
} 

、そしてあなたはそれが無期限に実行したくなかった場合はケースを停止するいくつかの並べ替えを紹介:非常に単純な例では、このようになります。

0

zzzzBovのように、このようなものです。

setTimeout('my_function()', 500); 
function my_function() { 
    // method in PHP 
    setTimeout('my_function()', 500); 
} 

my_functionのが最高スコープであるあなたが実行を開始する準備ができたら、最初のsetTimeoutはどこにでも行くことができていることを確認します。これは、0.5秒ごとにmy_functionを実行します。

関連する問題