【问题标题】:Keeping a jQuery .getJSON() connection open and waiting while in body of a page?在页面正文中保持 jQuery .getJSON() 连接打开并等待?
【发布时间】:2010-10-23 00:08:41
【问题描述】:

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

<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 直到页面关闭。如果有人对为什么我的简单更改不再按预期运行有任何见解,请告诉我。感谢您花时间阅读并帮助我。

最好的问候, 范阮

【问题讨论】:

    标签: javascript jquery comet server-push


    【解决方案1】:

    是的,你不会想要使用那个循环,你几乎就是 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);
    

    【讨论】:

    【解决方案2】:

    使用超时,这些类型的循环是一个非常糟糕的主意,所以如果您出于某种原因必须使用轮询,请确保您不要一直敲打您的后端。

    【讨论】:

      【解决方案3】:

      您要么需要更改为 altCognito 描述的轮询方法,要么可以使用 comet,它旨在将数据从服务器推送到客户端。根据您的需要,您可以使用 Jetty(用于 Java)或 Twisted(Python)或 WebSync(ASP.NET/IIS)

      【讨论】:

        【解决方案4】:

        我认为这是关于服务器推送的?

        使用 Socket.IO 怎么样?

        参考:Google Group (http://socket.io/) 介绍 Socket IO 0.9

        参考:http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery

        参考:Websockets、Node.js 和 jQuery 的乐趣 (http://nayna.org/blog/?p=159)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多