jQuery中setInterval的替代方法是什么?

时间:2012-01-06 17:49:03

标签: php jquery

我在点击按钮时使用jQuery来调用函数。正在调用的此函数在PHP中并返回日志记录信息。我曾尝试使用setInterval(),但它以我选择的任何速率调用函数,并且往往会返回重复的日志记录信息,并且大部分时间都会冻结。有没有办法可以从jQuery重复调用PHP函数,但只能在最后一次调用完成并返回后调用该函数?

以下是涉及setInterval()

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

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

这是它调用的PHP函数

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);
}

5 个答案:

答案 0 :(得分:2)

这将在第一个ajax事件完成后五秒钟触发另一个ajax事件。它无论成功还是失败都无关紧要。

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

编写像这样的代码的一些问题可能是它不包含取消的机制。

答案 1 :(得分:1)

在ajax调用的回调函数中使用setTimeout。

setTimeout只执行一次脚本并将其置于回调函数中,确保在为ajax调用创建另一个倒数计时器之前已完成ajax调用。

答案 2 :(得分:1)

听起来你想要的是一个AJAX调用,它在成功返回时递归调用自身。一个非常简单的例子看起来像这样:

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

你显然必须处理对该函数的初始调用,如果你不想让它无限期地运行,那就引入某种停止案例。

答案 3 :(得分:0)

您可以设置一个全局变量来保存jQuery ajax调用的状态。将其设置为null。在jQuery ajax的成功处理程序中,将其设置为completed。然后,在您设置的时间间隔内调用这段代码之前,请检查变量的值。如果已完成,则继续执行代码以通过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
             }
          });

  }

}

答案 4 :(得分:0)

像zzzzBov提到的那样,就像这样。

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

确保my_function处于最高范围,当您准备好开始执行时,第一个setTimeout可以到达任何地方。这每0.5秒执行一次my_function。