2012-01-06 43 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。

相关问题