我想用setTimeout每10秒重复一次函数。我的职责是:
dateInLive = function() {
crono = function(){
setTimeout(function() {
$('.datePoste').each(function(){
$(this).load('in_live.php','in_live='+$(this).attr('id'))
});
crono();
}
,10000);
}
crono();
}
但是,它真的是随机的;有时它会在15秒后重复,有时在3秒后重复,有时在6秒后重复。
答案 0 :(得分:2)
您正在使用setTimeout
来运行重复活动。
这是正确的(其他人建议使用setInterval
,但这有问题。)
然而,您没有在后续调用中设置超时 - 您只是直接调用crono()
函数,因此在初始超时延迟之后,它将立即开始一遍又一遍地调用自身永远(直到它耗尽堆栈空间)。
您需要做的是每次调用该函数时调用setTimeout()
。重新编码如下:
dateInLive = function() {
crono = function(){
$('.datePoste').each(function(){
$(this).load('in_live.php','in_live='+$(this).attr('id'))
});
setTimeout(crono,10000);
}
setTimeout(crono,10000);
}
答案 1 :(得分:2)
仅在完成所有ajax请求后才召回crono()
:
function crono(){
setTimeout(function() {
var arr = [];
$('.datePoste').each(function(){
var self = this;
xhr = $.get('in_live.php', {in_live : this.id}, function(data) {
$(self).html( $.parseHTML(data) );
});
arr.push(xhr);
});
$.when.apply($, arr).done(crono);
}, 10000);
}
答案 2 :(得分:2)
在这种情况下,我会使用延迟对象。
function crono(){
setTimeout(function() {
var defArr = [];
$('.datePoste').each(function(i,el){
var deferred = $.Deferred();
defArr.push(deferred.promise());
$(this).load('in_live.php','in_live='+$(this).attr('id'), function() {
deferred.resolve();
});
});
$.when.apply($,defArr).done(crono);
}, 10000);
}
这样做会请求所有部分,然后当收到所有部分时,等待10秒再次请求它们,避免在缓慢的网络情况下堆积请求。
答案 3 :(得分:0)
你在创建新的超时之前做了一些事情,这意味着肯定会有“一些”延迟。
查看setInterval()函数。
答案 4 :(得分:0)
你的crono()
功能只是在错误的地方。
dateInLive = function() {
crono = function(){
setTimeout(function() {
crono();
$('.datePoste').each(function(){
$(this).load('in_live.php','in_live='+$(this).attr('id'))
});
}
,10000);
}
}