【问题标题】:Sinatra app bombards server with requestsSinatra 应用程序用请求轰炸服务器
【发布时间】:2012-09-06 13:37:55
【问题描述】:

我正在尝试按照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>

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

【问题讨论】:

标签: jquery ruby sinatra


【解决方案1】:

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

以下工作,无论是在&lt;head&gt; 还是在&lt;body&gt; 的末尾,都无关紧要。

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

the Tin Man 的分析是正确的,但是分辨率是错误的……考虑这个函数:

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

当它运行时,setTimeout 调用将函数设置为在一秒钟后再次调用,但它会立即返回,因此会立即重新加载。通过将setTimeout 置于函数之外,我们确保仅在一秒钟后发生重新加载。因为页面重新加载,代码又被执行了,就可以了!

【讨论】:

  • 好收获。我对我的 JavaScript setTimeout 行为感到生疏了。
【解决方案2】:

setTimeout() 在超时和调用getUpdate() 之前需要等待的毫秒数,所以它等待一秒钟然后发送另一个load 请求。最重要的是,您正在加载页面,然后在页面加载时,告诉它再次加载,并重复执行此操作。

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


编辑:

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

不幸的是,这不是你要它做的事情:

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

这个 sn-p 告诉浏览器在解析 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 秒加载一次。
  • 我也把它移到了最后,但结果是一样的。
  • @nikhil 上面提到的setTimeout$("body").load 语句的顺序你改了吗?
  • $() 在 document.ready 或之后运行,即在标记结束之后,因此变化不大。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2022-12-03
相关资源
最近更新 更多