JavaScript setInterval()冻结我的网站

JavaScript setInterval()冻结我的网站,javascript,setinterval,Javascript,Setinterval,我在Raspberry Pi3中安装了Apache,以获得一个本地网站。 我的index.php中有一个JavaScript,我需要每200毫秒刷新一次: function Function() { $.ajax({ url : 'variable.php', data: {action: 'variable'}, type: 'post', success: function(output){ do

我在Raspberry Pi3中安装了Apache,以获得一个本地网站。 我的
index.php
中有一个JavaScript,我需要每200毫秒刷新一次:

function Function()
{
    $.ajax({
        url : 'variable.php',
        data: {action: 'variable'},
        type: 'post',
        success: function(output){
            document.getElementById("demo").innerHTML= output;
            setInterval(Function(),200);
        }
    });
}
variable.php
中,它只是一个命令的输出

但是,在2分钟内,可用内存从22万KiB变为4万KiB,因此我的网站在10分钟内开始冻结,我必须关闭我的网络并重新打开它


怎么了?

这或多或少会成为一个无休止的递归问题,因为在XHR的每次回调中,您都在调用
函数(因为这里有括号,进行调用而不是引用),并将其设置为每200ms调用一次。您应该只将引用传递给那里的函数,而使用
setTimeout()

setTimeout(Function, 200);

而且,
函数
对于函数来说是个坏名字。它还将关闭
函数
构造函数。

这是一个递归调用,应该明智地处理。我建议您在Ajax.Success回调上调用递归函数,如果前一个Ajax调用成功,它将帮助您调用该函数。并且您将防止限制服务器。

您刚刚解释了问题并提供了自己的解决方案。。问题:“可用内存从220 000 KiB增加到40 000 KiB”=>解决方案:“我必须关闭我的web internet并重新打开它”如果内存用完,您可能会被迫重新启动浏览器以释放内存?我也很惊讶
setInterval(Function(),200)
之所以有效,是因为您选择的函数名是
function
,如果它允许您使用该函数名,我很确定您的间隔应该是这样的
setInterval(function,200)我认为您的setTImeout非常短,因此它会在一秒钟内请求多次,而且每次ajax成功运行时,您都会设置一个新的间隔。计算出你在2分钟内的休息时间。我很惊讶你的浏览器不只是崩溃。那么,我怎样才能在不崩溃浏览器的情况下用javascript正确刷新?用
setInterval()
替换
setTimeout()
,也许可以留出更多的时间。。。。200毫秒是疯狂的,如果您必须等待1秒才能重新加载数据,您不会注意到与200毫秒有多大的差异,但这会对服务器产生很大的影响,因为它不会收到如此多的垃圾邮件请求。良好的平衡也取决于您使用的服务器。如果您想要实时数据,我建议您考虑使用WebSocket。一个请求,但保持打开状态,允许更新和交换数据。或者在第一次调用
函数时使用
setInterval
。我建议不要这样做,好像有些XHR需要很长时间,请求就会堆积起来。在某些情况下,这对设计是合适的。我不明白你所说的“你应该只传递对那里函数的引用”是什么意思。@Zekeriya看看答案中的示例代码。函数名后没有
()
。如果有它们,则在IP到达该行时调用该函数。如果没有它们,您将有一个对该函数的引用,一个指针(如果您愿意的话)。这意味着函数不会立即被调用,而是
setTimeout()
现在有一个对它的引用供以后调用。即使我将“setTimeout()”刷新1秒,也不会改变可用内存的下降。