我正在编写一个基本的推送消息系统。一个小小的改变导致它正常停止工作。让我解释。在我的原始版本中,我能够将代码放在文档中,如下所示:
<head>
...text/javascript">
$(document).ready(function(){
$(document).ajaxStop(check4Updates);
check4Updates();
});
function check4Updates(){
$.getJSON('%PATH%', callback);
};
...
</head>
这很好用,并且即使服务器返回null(它会在超时2分钟之后),也会保持连接打开。它会无限期地一遍又一遍地调用getJSON函数。快乐的熊猫。
现在,我必须将代码段放在标签之间。几乎无法访问$(document).ready()函数。
<body>
...
check4Updates();
$("body").ajaxStop(check4Updates);
...
</body>
这有效......暂时。此后不久,它将停止调用check4Updates并进入无限循环并使用100%处理器时间。
我正在试图让它重复调用check4Updates直到页面关闭。如果有人对我为什么简单的更改不再按预期运行有任何见解,请告诉我。感谢您抽出宝贵时间阅读并帮助我。
最诚挚的问候, Van Nguyen
答案 0 :(得分:6)
是的,你不会想要使用那个循环,你自己就是DOSing,更不用说锁定客户了。
很简单,创建一个轮询插件:
来源:http://web.archive.org/web/20081227121015/http://buntin.org:80/2008/sep/23/jquery-polling-plugin/
用法:
$("#chat").poll({
url: "/chat/ajax/1/messages/",
interval: 3000,
type: "GET",
success: function(data){
$("#chat").append(data);
}
});
支持它的代码:
(function($) {
$.fn.poll = function(options){
var $this = $(this);
// extend our default options with those provided
var opts = $.extend({}, $.fn.poll.defaults, options);
setInterval(update, opts.interval);
// method used to update element html
function update(){
$.ajax({
type: opts.type,
url: opts.url,
success: opts.success
});
};
};
// default options
$.fn.poll.defaults = {
type: "POST",
url: ".",
success: '',
interval: 2000
};
})(jQuery);
答案 1 :(得分:0)
使用超时,这些类型的循环是一个非常糟糕的主意,因此如果您因任何原因必须使用轮询,请确保不要继续锤击后端。
答案 2 :(得分:0)
您需要更改为altCognito所描述的轮询方法,或者您可以使用comet,它旨在将数据从服务器推送到客户端。根据您的需要,您可以使用Jetty(用于Java)或Twisted(Python)或WebSync(ASP.NET / IIS)
答案 3 :(得分:0)
我认为这是关于服务器推送的?
如何使用Socket.IO?
参考:介绍Socket IO 0.9,Google Group(http://socket.io/)
参考:http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery
参考:使用websockets,Node.js和jQuery(http://nayna.org/blog/?p=159)
的乐趣