Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我的设置超时不';我不尊重延误_Javascript_Jquery_Settimeout - Fatal编程技术网

Javascript 我的设置超时不';我不尊重延误

Javascript 我的设置超时不';我不尊重延误,javascript,jquery,settimeout,Javascript,Jquery,Settimeout,我想用setTimeout每隔10秒重复一次函数。我的职能是: dateInLive = function() { crono = function(){ setTimeout(function() { $('.datePoste').each(function(){ $(this).load('in_live.php','in_live='+$(this).attr('id')) });

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

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


看看函数。

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


请查看该函数。

您只是将
crono()
函数放在了错误的位置

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

}

您只是将
crono()
函数放在了错误的位置

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

}

您正在使用
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);
}

您正在使用
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);
}
仅当所有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);
}
仅当所有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);
}

在这种情况下,我将使用延迟对象

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秒并再次请求,避免请求在缓慢的网络情况下堆积。

在这种情况下,我将使用延迟对象

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秒并再次请求它们,避免请求在缓慢的网络情况下堆积。

@user125697否,他在
setTimeout()内调用它以重复该功能。最好改用
setInteral()
。@Antony为什么不使用setInterval?在这种情况下??没关系,循环将在0.00003毫秒内完成,因为load()是异步的,并且会立即调用crono,所以使用interval没有明显的优势。@GradislavaBikkulova首先,您应该使用
setInterval()
在这种情况下。其次,由浏览器决定何时再次调用函数。将其设置为
10000
并不保证每10秒执行一次。下面是我的测试,测试运行
setInterval()
所需的实际时间。不管其他人怎么说,不要使用
setInterval
。有很好的理由不使用所描述的
setInterval
。@user125697不,他在
setTimeout()
内调用它来重复该函数。最好改用
setInteral()
。@Antony为什么不使用setInterval?在这种情况下??没关系,循环将在0.00003毫秒内完成,因为load()是异步的,并且会立即调用crono,所以使用interval没有明显的优势。@GradislavaBikkulova首先,您应该使用
setInterval()
在这种情况下。其次,由浏览器决定何时再次调用函数。将其设置为
10000
并不保证每10秒执行一次。下面是我的测试,测试运行
setInterval()
所需的实际时间。不管其他人怎么说,不要使用
setInterval
。如前所述,有很好的理由不使用
setInterval
。这看起来不是我的问题。超时在函数内,函数只在该超时内被再次调用。使用函数声明语法可能也不错。我仍然有相同的问题。看起来这不是我的问题。超时在函数内,函数只在该超时内被再次调用。使用函数声明语法可能也不错。我仍然有相同的问题啊,在我发布我的答案之前,我没有看到你的答案。但我不认为有一个问题。load返回一个xhr,但我可能错了。我很确定promise对象是从中返回的。promise用于动画队列,而不是ajax请求。@KevinB-也不确定load,但所有其他ajax方法都返回一个promise,只是在load()上找不到任何内容?因为.load返回一个jQuery集合,这就是我的想法所在。在jQuery集合上使用.promise()(这是.when所做的)将获得一个promise对象,该对象将在所有现有动画完成时解析。我现在没有一个简单的方法来测试它。@KevinB-我很确定你关于
load()
不返回承诺的说法是正确的,所以我将它改为
$。get
,因为似乎没有任何过滤。这样更好,但我还有一个挑剔:)因为你使用的是
$。get()
,您必须使用
.html
,这似乎会导致整个html文档在IE9中出现内存泄漏。(参考:)首先使用
$.parseHTML()
应该可以修复它。我怀疑
数据类型:“html”
(或
$.get(…,“html)
)也会修复它。啊,我在发布我的答案之前没有看到你的答案。不过我不认为有一个问题。load返回一个xhr,我可能是