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