2012-01-06 42 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 2012-01-06 17:50:15

+1

有些代碼可以幫助你。 – j08691 2012-01-06 17:52:04

回答

2

這將在第一個結束五秒後觸發另一個ajax事件。不管它是成功還是失敗都不重要。

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

這樣寫代碼的一些問題可能是它不包含取消機制。

1

使用的setTimeout PHP函數。

setTimeout只執行一次腳本,並將其放置在回調函數中,以確保在爲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。

相關問題