1

我有一个关于使用 setInterval(); 的问题 在 JavaScript 中。我正在开发一家医院的(PHP/SQL,Ajax)数据库,现在每当进行专利测试时,它应该在主屏幕上显示一条消息,上面写着“(专利名称)的测试结果已更新”。我尝试使用 php 脚本执行此操作,但无法直接从 php 脚本触发事件。现在我为此目的使用 setInterval(),它运行一个函数,该函数每 10 秒检查一次专利数据库,并在添加新测试时显示消息。

   setInterval(checkAndDisplayNewResults(), 10000);

我的问题是“这是正确的方法吗?它不会使服务器或客户端 PC 过载吗?如果它不是正确的方法,那么还有什么替代方法?

4

8 回答 8

5

永远每 10 秒轮询一次服务器很少是获取更新的正确方法。对于客户端和服务器以及网络来说,它的效率都非常低。您应该将轮询间隔返回到更慢的时间间隔,或者实施更智能的东西,例如服务器推送解决方案。

一种更有效的解决方案是Comet,它由长时间运行的服务器请求组成,一旦服务器使数据可用,就会返回数据。

HTML5 还指定了一个WebSocket接口,它允许客户端和服务器只在两者之间打开一个套接字,并根据需要自由地发送数据。

于 2012-05-04T07:57:30.100 回答
1

我认为您会使服务器过载更多。特别是如果有很多来自不同地方的连接。使用 Comet 技术可能会有所帮助:

http://www.lightstreamer.com/

http://www.ape-project.org/

于 2012-05-04T07:57:12.813 回答
0

这取决于函数的作用,但如果间隔为 10 秒,则很可能不会。你可能应该这样写:

setInterval(checkAndDisplayNewResults, 10000);
于 2012-05-04T07:55:55.863 回答
0

问题不在于它,setInterval()因为它只是执行代码。

问题在于:

  1. HTTP 请求

    在单台 PC 上每 10 秒轮询一次就可以了。但是,如果您有多台 PC 轮询您的服务器,它会占用您的带宽并由于多个请求而增加服务器的开销。想象一下,每 10 秒就有相当于整个医院的 PC 轰炸您的服务器。

  2. 浏览器 DOM

    此外,如果这是一个信息亭应用程序,您还应该担心要加载到 DOM 中的项目数量。就像在机场“航班时刻表屏幕”中说的那样,您只需将越来越多的项目添加到列表中。如果您不删除那些未使用的项目,它将占用内存。

于 2012-05-04T07:57:20.460 回答
0

如果您使用 setInterval,请确保您只设置一次间隔。否则你可能会得到多个实例。

您可以搜索 websockets,看看这是否适合您

于 2012-05-04T07:58:49.227 回答
0

服务器应该每 10 秒处理 1 个请求而没有问题,我认为这是不言自明的。

客户也不会有任何问题。只确保像约瑟夫所说的那样摆脱 DOM 元素,否则 RAM 会慢慢填满。

这一切都归结为您拥有多少客户端。请注意,网络服务器可以处理相当多的请求,所以不要害怕使用它。但是你没有提到有多少客户。

如果有很多客户,我唯一想到的就是数据库,那个查询有多重?结果应该被缓存吗?每5-10秒可能吗?

如果使用 AJAX 是您完成此任务的最简单方法,那么我说去吧 :)

于 2012-05-04T08:24:31.167 回答
0

作为对jfriend00 的回答的补充,我建议寻找另一种解决方案,而不是使用setInterval来做你想做的事。

setInterval由于某种原因被认为是有害的:

  • setInterval忽略错误
  • setInterval不关心网络延迟
  • setInterval不保证执行

您可以在那里查看更多信息http://zetafleet.com/blog/why-i-consider-setinterval-harmful

如果您真的别无选择,只能使用这种技术检查服务器更新,那么像下面这样的代码会更有效

var timer = null,
    delay = 1000;

function checkAndDisplayNewResults() {
    // do some work

    // when the work is finished, set a timer to call again the function
    timer = setTimeout( checkAndDisplayNewResults, delay );

    // the term "when the work is finished" means in this case, when your AJAX request is finished
    // and not simply at the end of the checkAndDisplayNewResults function
}

// call the function immediately
checkAndDisplayNewResults();

此外,正如Joseph 所说,请注意此技术可能给您的应用程序带来的带宽开销。

在任何情况下,正如其他人所指出的,还有其他更好的方法可以做到这一点:WebSocket、服务器发送事件、HTTP 轮询、AJAX 推送、长加载 iframe 等......你可以查看这篇关于 Web 的文章的介绍套接字http://www.html5rocks.com/en/tutorials/websockets/basics/并阅读更多内容以了解如何使用 Web 套接字

于 2012-05-04T09:28:06.733 回答
-2

是的,这是正确的方法,您别无选择,例如 Gmail 使用相同的技术向您显示新电子邮件。

于 2012-05-04T07:57:08.323 回答