Sinatra app用请求轰炸服务器

时间:2012-09-05 18:45:52

标签: jquery ruby sinatra

我正在尝试按照screencast.org截屏视频编写一个小型的sinatra应用程序。我想将jQuery与sinatra一起用于ajax。

一旦我开始,我的应用程序就会向服务器发出请求。 Firebug显示请求最高可达2MB /秒。

这些是我layout.erb的内容。

<!doctype html>
<html>
<head>
<title>Is it My Birthday</title>

<script src="jquery.js"></script>
<script>
function getUpdate()
{
  setTimeout(getUpdate, 1000);
  $("body").load("/");
}
</script>
</head>

<body>
<%= yield %>


<script>
$(getUpdate);
</script>
</body>
</html>

它不是每秒运行一次,而是无限运行。我哪里出错?

2 个答案:

答案 0 :(得分:2)

setTimeout()需要在超时和调用getUpdate()之前等待的毫秒数,因此等待一秒钟然后发送另一个load请求。最重要的是,你正在加载页面,然后,当页面加载时,告诉它再次加载,并重复这样做。

尝试将$(getUpdate);移动到<script>标记中的HTML底部,或者在页面加载完成后触发的页面事件处理程序内。


编辑:

  

我希望它每1秒加载一次。

不幸的是,这不是你告诉它的事情:

$(getUpdate);
function getUpdate()
{
  $("body").load("/");

此代码段告诉浏览器在解析JavaScript时遇到getUpdate时会立即运行$(getUpdate);,所以它会这样做。然后它要做的第一件事是$("body").load("/");重新加载页面,导致浏览器重新解释JavaScript,它看到$(getUpdate);并立即重新加载。

您的setTimeout(getUpdate, 1000);永远不会被执行。

更改顺序:

<script>
function getUpdate()
{
  setTimeout(getUpdate, 1000);
  $("body").load("/");
}
</script>

...
bunches of HTML
...

<script>
  $(getUpdate);
</script>

答案 1 :(得分:2)

  

我希望它每1秒加载一次。

<head><body>末尾的以下作品并不重要。

<script>
function reload() {
  $("body").load("/");
}
setTimeout(reload, 1000);
</script>

the Tin Man完成的分析是正确的,但解决方案是错误的......考虑这个函数:

function reload() {
  setTimeout(reload, 1000);
  $("body").load("/");
}

当它运行时,setTimeout调用将函数设置为稍后再次调用 ,但它会立即返回,以便立即重新加载。通过将setTimeout放在函数之外,我们确保仅在一秒钟之后重新加载。因为页面重新加载,代码再次执行,并且它可以工作!