我的setTimeout不尊重延迟

时间:2013-03-26 15:48:54

标签: javascript jquery settimeout

我想用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秒后重复。

5 个答案:

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

}