Javascript Ajax请求计时器更新间隙

Javascript Ajax请求计时器更新间隙,javascript,php,jquery,ajax,timer,Javascript,Php,Jquery,Ajax,Timer,我的数据库中有一个表,其中包含启动/停止计时器的时间,在我的索引中,我得到了一个以秒为单位显示剩余时间的表。 我每1秒就有一个ajax请求 function timer(){ $.ajax({ type: "GET", url: "timeleft.php", success: function(msg){ $('#timeleft').html(msg); } }); } setInterval(timer, 1000); 问题

我的数据库中有一个表,其中包含启动/停止计时器的时间,在我的索引中,我得到了一个以秒为单位显示剩余时间的表。 我每1秒就有一个ajax请求

function timer(){
$.ajax({
    type: "GET",
    url: "timeleft.php",
    success: function(msg){
        $('#timeleft').html(msg);
        }
    });
}
setInterval(timer, 1000);
问题是:计时器没有正确显示剩余时间,有时它只更新5到5秒(120、115、110),更新需要5秒,有时它会这样做120、115、114、109、108、103(5秒卡住,然后1秒更新正常) 最奇怪的是,当我在chrome上按f12键查看发生了什么时,计时器开始像一个符咒一样工作。显示timeleft.php请求需要200~400ms才能加载。 同一页面中没有任何其他函数或任何东西具有任何5秒的间隔。 我不知道为什么,请帮帮我。 多谢各位

编辑:问题其实不在javascript中。更新不好的是timeleft.php

<?php
@include_once ("set.php");
$game = fetchinfo("value","info","name","current_game");
$r = fetchinfo("starttime","games","id",$game);
if($r == 2147483647) die("120");
$r += 120-time();
if($r < 0) $r = 0;
echo $r;
?>

设置“开始时间”后,我在浏览器中访问此页面并一直按f5,它不会实时更新。
可能是什么?谢谢

您必须考虑到Ajax请求有自己的处理时间,可以是200~400ms。如果超时,这将大大扭曲时间限制。这就是为什么在需要精确性的情况下,依赖数据库的轮询计时器并不适合的原因。

您必须考虑到Ajax请求有自己的处理时间,这可能是200~400ms。如果超时,这将大大扭曲时间限制。这就是为什么在需要精确性的情况下,依赖数据库的轮询计时器不是一个很好的选择。

为什么要这样做。在我看来,正确的方法是在一个ajax请求中获取计时器的过期时间,然后使用javascript倒计时

var-timerEnds=0;
函数startTimer(){
if(timeDelay!=null | | timeDelay!=未定义){
清除间隔(时间延迟);
clearInterval(checkTime);//如果使用5秒同步
}
$.ajax({
键入:“获取”,
url:“timeleft.php”,
成功:功能(msg){
timerEnds=msg;
var timeDelay=设置间隔(updateTimer,1000);
var checkTime=setInterval(startTimer,5000);//包括这一行以每5秒将过期时间与服务器同步
}
});
}
函数updateTimer(){
remainingTime=timerEnds-(Date.now()/1000);
如果(剩余时间>-1){
剩余分钟=数学楼层(剩余时间/60);
剩余秒=数学楼层(剩余时间票证分钟*60);
$(“计时器”).html(剩余分钟+”:“+剩余秒);
}否则{
//使用以下命令在时间到期后更新到期时间
剩余时间=0;
剩余分钟=数学楼层(剩余时间/60);
剩余秒=数学楼层(剩余时间票证分钟*60);
$(“计时器”).html(剩余分钟+”:“+剩余秒);
startTimer();
}

}
你为什么要这样做。在我看来,正确的方法是在一个ajax请求中获取计时器的过期时间,然后使用javascript倒计时

var-timerEnds=0;
函数startTimer(){
if(timeDelay!=null | | timeDelay!=未定义){
清除间隔(时间延迟);
clearInterval(checkTime);//如果使用5秒同步
}
$.ajax({
键入:“获取”,
url:“timeleft.php”,
成功:功能(msg){
timerEnds=msg;
var timeDelay=设置间隔(updateTimer,1000);
var checkTime=setInterval(startTimer,5000);//包括这一行以每5秒将过期时间与服务器同步
}
});
}
函数updateTimer(){
remainingTime=timerEnds-(Date.now()/1000);
如果(剩余时间>-1){
剩余分钟=数学楼层(剩余时间/60);
剩余秒=数学楼层(剩余时间票证分钟*60);
$(“计时器”).html(剩余分钟+”:“+剩余秒);
}否则{
//使用以下命令在时间到期后更新到期时间
剩余时间=0;
剩余分钟=数学楼层(剩余时间/60);
剩余秒=数学楼层(剩余时间票证分钟*60);
$(“计时器”).html(剩余分钟+”:“+剩余秒);
startTimer();
}

}
Ajax只不过是异步JavaScript和XML。您无法控制执行和响应时间。我建议您在页面加载时使用
setInterval
获取
timeleft
并使用它,但timeleft不断变化,就像一个游戏时间计数器。在任务开始之前,计时器显示剩余120秒,并保持此状态,直到某个任务开始,一旦启动,网站外的bot脚本就会更新表格,将时间戳中的结束时间设置为从当前时间开始120秒,然后它开始显示timeleft,当它下降到0时,div再次显示120秒,直到另一个任务开始。这些任务在“游戏”中有多少用户时被激活。这是一个赌博网站,我购买了源代码。一旦页面加载,获取剩余时间并不断更新。但是当它变为0时会发生什么?然后,当在数据库上再次设置时间时,计时器应该从120Is开始再次计数。时间()本身在跳跃,或者在应用逻辑后脚本在跳跃。Ajax只不过是异步JavaScript和XML。您无法控制执行和响应时间。我建议您在页面加载时使用
setInterval
获取
timeleft
并使用它,但timeleft不断变化