Javascript setTimeout inside setInterval
Javascript setTimeout inside setInterval
我这里有个问题。。我使用setInterval
函数将页面加载到div中,每30秒加载一次。好在那一页中,我有另一个setInterval
函数,它由每秒更改一个数字的倒计时组成。问题是,一次倒计时会跳过3秒,即使它必须在一秒钟内回调。就像:01:24->01:21->01->19…
这是我第一次设置间隔的代码:
<script>
var t;
t=setInterval(function(){
$.get('<?=return_url("php/home_new.php");?>', { k: "1" } ).done(function(data){
if(data)$("#ex_start_test").html(data);});
},
30000
);
</script>
以及倒计时代码:
<?
$query=q_return("SELECT nume, cod, data, MINUTE(data_start) as minute, data_start FROM chestionare WHERE data_start>date_sub(now(), interval 2 minute)");?>
<script>
var timp_c="<?=$query['minute'];?>";
var sec;
var min;
$.get('<?=return_url("php/getimp.php");?>', { k: "sec" } ).done(function(data){sec=data;});
$.get('<?=return_url("php/getimp.php");?>', { k: "min" } ).done(function(data){min=data;});
setTimeout(refresh, 1000);
function refresh(){
if(sec>=1){
sec=sec-1;
}else{
min=min-1;
sec=59;
}
if(sec<10){
$("span#ex_start_timp_ramas_sec").each(function(){
$(this).html("0"+sec);
});
}else{
$("span#ex_start_timp_ramas_sec").each(function(){
$(this).html(sec);
});
}
$("span#ex_start_timp_ramas_min").each(function(){
$(this).html(min);
});
if(sec==0 && min==0){
//$("#ex_click_final").trigger('click');
clearInterval(t);
$("#ex_new_test").hide();
}
setTimeout(refresh, 1000);
}
</script>
我想你的问题是,每次用setInterval
重新加载页面时,你都会生成另一个setTimeout
链,而没有清除前一个。
尝试保存您的timeoutId
并将其作为倒计时代码中的第一件事进行清除。像这样的东西应该起作用:
<?
$query=q_return("SELECT nume, cod, data, MINUTE(data_start) as minute, data_start FROM chestionare WHERE data_start>date_sub(now(), interval 2 minute)");?>
<script>
var timp_c="<?=$query['minute'];?>";
var sec,
min,
timeoutId;
$.get('<?=return_url("php/getimp.php");?>', { k: "sec" } ).done(function(data){sec=data;});
$.get('<?=return_url("php/getimp.php");?>', { k: "min" } ).done(function(data){min=data;});
if (timeoutId) {
clearTimout(timeoutId);
}
timeoutId = setTimeout(refresh, 1000);
function refresh(){
if(sec>=1){
sec=sec-1;
}else{
min=min-1;
sec=59;
}
if(sec<10){
$("span#ex_start_timp_ramas_sec").each(function(){
$(this).html("0"+sec);
});
}else{
$("span#ex_start_timp_ramas_sec").each(function(){
$(this).html(sec);
});
}
$("span#ex_start_timp_ramas_min").each(function(){
$(this).html(min);
});
if(sec==0 && min==0){
//$("#ex_click_final").trigger('click');
clearInterval(t);
$("#ex_new_test").hide();
}
timeoutId = setTimeout(refresh, 1000);
}
</script>
我认为这里的问题是,您发出两个Ajax请求,然后您想启动计时器,但这些请求需要时间执行,因为它们是异步的,这可以解释您看到的结果。
$.when()
救援:
var $getsec = $.get('<?=return_url("php/getimp.php");?>', { k: "sec" } ),
$getmin = $.get('<?=return_url("php/getimp.php");?>', { k: "min" } );
$.when($getsec, $getmin).done(function($sec, $min) {
min = $min[0]; // [0] = data
sec = $sec[0];
// start refresh
setTimeout(refresh, 1000);
});
相关文章:
- node.js:setInterval()正在跳过调用
- setInterval和clearInterval javascript无法按需工作
- Don'我不明白为什么我的setInterval+jQuery;不起作用
- setInterval游戏循环的范围问题
- JavaScript setInterval problems
- 如何在Javascript中延迟setInterval
- 如何执行相同的setInterval()
- SetInterval在javascript对象中表现怪异
- 从setInterval方法移动到带有sprite的requestAnimationFrame
- $(window).height() inside iframe?
- php inside javascript
- 如何在悬停时暂停setInterval
- 可以't获取setInterval函数以使用javascript中的this.function_name调用另一
- 删除对象时终止setInterval
- 使用setInterval()函数进行图像闪烁
- “;对于“;内部”;setInterval”;
- 在setInterval函数之前声明时未定义对象
- 使setInterval和setTimeout工作时出现问题
- Promises inside a setInterval
- Javascript setTimeout inside setInterval