2017-06-20 52 views
2

我在我的Raspberry Pi3中安装了Apache以获取本地网站。 我有这个JavaScript在我index.php,我需要刷新每200ms:JavaScript setInterval()冻结我的网站

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分钟内,空闲内存从220 000 KiB增加到40 000 KiB,所以我的网站在10分钟内开始冻结,我必须关闭我的网络并重新打开它。

怎么了?

+0

你刚刚解释了这个问题,并提供了自己的解决方案。**问题:** *“空闲内存从220 000 KiB到400 000 KiB”* => **解决方案:** *“我必须关闭我的网络并重新打开它。“*也许一旦你用完内存,你不得不重新启动浏览器来释放内存?我也惊讶'setInterval(Function(),200);'因为你选择的函数名是'function',如果它允许你使用那个函数名,我很确定你的间隔应该是这样的'setInterval(Function,200);' – NewToJS

+1

我认为你的setTImeout很短,所以它会在一秒钟内请求很多 –

+0

你也可以在每次Ajax成功运行时设置一个新的时间间隔。计算你在2分钟内有多少间隔。我很惊讶你的浏览器不会崩溃。 – NewToJS

回答

6

它变得或多或少是一个无限的递归问题,因为在你调用的XHR的每个回调函数中,你要调用Function(因为你有括号括起来,做一个调用而不是引用),并且每200ms调用一次。您应该只传递该函数的引用,并使用setTimeout()代替。

setTimeout(Function, 200); 

此外,Function是一个不好的功能名称。它也会摧毁构造函数Function

+0

或者在第一次调用'Function'时使用'setInterval'' –

+2

@NathanP。我会建议反对它,就好像一些XHR需要很长时间,这些请求会堆积起来。在某些情况下,虽然这对设计是适当的。 – alex

+0

我不明白你的意思是“你应该只通过对那里的函数的引用”。 – Zekeriya

1

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