0

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

4

5 回答 5

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

这样做会请求所有的section,然后当所有的section都收到后,等待10秒再请求,避免在网速慢的情况下请求堆积。

于 2013-03-26T16:05:09.467 回答
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);
}
于 2013-03-26T15:56:14.050 回答
2

crono()仅在完成所有 ajax 请求时才调用:

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);
}
于 2013-03-26T15:59:33.957 回答
0

你只是crono()在错误的地方有这个功能。

dateInLive = function() {
 crono = function(){
 setTimeout(function() {
        crono();
        $('.datePoste').each(function(){
               $(this).load('in_live.php','in_live='+$(this).attr('id'))
           });
        }
        ,10000);
    }

}
于 2013-03-26T15:53:59.057 回答
0

您在创建新超时之前正在做某事,这意味着肯定会有“一些”延迟。

看看setInterval()函数。

于 2013-03-26T15:52:39.437 回答