保持jQuery .getJSON()连接打开并在页面正文中等待?

时间:2009-04-30 22:29:44

标签: javascript jquery comet server-push

我正在编写一个基本的推送消息系统。一个小小的改变导致它正常停止工作。让我解释。在我的原始版本中,我能够将代码放在文档中,如下所示:

<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

4 个答案:

答案 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

的乐趣