我有一个关于使用setInterval()的问题;在javascript中。我正在开发一个医院(PHP / SQL,Ajax)数据库,现在每当进行专利测试时它应该在主屏幕上显示一条消息,说“(Pateints Name)的测试结果已更新”。我尝试用PHP脚本来做,但没有办法直接从PHP脚本触发事件。现在我正在使用setInterval()来运行一个函数,该函数每10秒检查一次专利数据库,并在添加新测试时显示消息。
setInterval(checkAndDisplayNewResults(), 10000);
我的问题是“它是否是正确的方法?它不会使服务器或客户端PC过载吗?如果不是正确的方式,那么替代方案是什么?
答案 0 :(得分:5)
永远每10秒轮询一次服务器很少是获得更新的正确方法。对于客户端,服务器和网络来说,这都是非常低效的。您应该将轮询间隔恢复到更慢的时间间隔,或者像服务器推送解决方案那样实现更智能的东西。
效率更高的一个解决方案是Comet,它包含长时间运行的服务器请求,只要服务器提供数据就会立即返回数据。
HTML5还指定了一个WebSocket接口,允许客户端和服务器在两者之间打开一个套接字,并根据需要随意发送数据。
答案 1 :(得分:1)
我认为你会更多地重载服务器。特别是如果有来自不同地方的很多连接。使用Comet技术可能有所帮助:
答案 2 :(得分:0)
这取决于功能的作用,但如果是10秒的间隔,则很可能不会。你可能应该这样写:
setInterval(checkAndDisplayNewResults, 10000);
答案 3 :(得分:0)
问题不在于setInterval()
,因为它只是执行代码。
问题在于:
HTTP请求
在一台PC上每10秒轮询一次就可以了。但是,如果您有多台PC轮询您的服务器,它将占用您的带宽,并且由于多个请求而增加了服务器的开销。想象一下,整个医院每10秒就会轰炸你的服务器。
浏览器DOM
此外,如果这是一个自助服务终端应用程序,您还应该担心要加载到DOM中的项目数。就像在机场“航班时刻表屏幕”中说的那样,您只需在列表中添加越来越多的项目。如果你不删除那些未使用的物品,它会耗尽记忆。
答案 4 :(得分:0)
如果使用setInterval,请确保仅设置一次间隔。否则你可能会得到多个实例。
您可以搜索websockets并查看它是否适合您
答案 5 :(得分:0)
服务器应该每10秒处理1个请求,没有任何问题,我认为这是不言自明的。
客户也不会遇到任何问题。只确保摆脱像Joseph说的DOM元素,否则RAM会慢慢填满。
这一切都归结为您拥有多少客户端。请注意,网络服务器可以处理大量请求,因此不要害怕使用它。但你没有提到有关有多少客户的事情。
如果有很多客户端,我唯一想到的就是数据库,那个查询有多重?结果应该缓存吗?可能每5-10秒?
如果使用AJAX是最简单的方法来实现这一点,那么我说去吧:)
答案 6 :(得分:0)
作为jfriend00's answer的补充,我建议寻找另一种解决方案,而不是使用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();
此外,作为said by Joseph,请注意此技术可能为您的应用带来的带宽开销。
无论如何,正如其他人所指出的,还有其他更好的方法:WebSocket,服务器发送事件,HTTP轮询,AJAX推送,长时间加载iframe等......你可以查看本文的介绍有关Web套接字http://www.html5rocks.com/en/tutorials/websockets/basics/的内容,并阅读更多内容以了解如何使用Web套接字
答案 7 :(得分:-2)
是的,这是正确的方式,您别无选择,例如Gmail使用相同的技术向您显示新的电子邮件。