Сохранять ли соединение jQuery .getJSON () открытым и ожидать в теле страницы? - PullRequest
2 голосов
/ 01 мая 2009

Я пишу основную систему 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 неоднократно вызывался до тех пор, пока страница не будет закрыта. Если у кого-то есть понимание того, почему мое простое изменение больше не работает должным образом, ПОЖАЛУЙСТА, дайте мне знать. Спасибо, что нашли время, чтобы прочитать и помочь мне.

С наилучшими пожеланиями, Ван Нгуен

Ответы [ 4 ]

6 голосов
/ 01 мая 2009

Да, вы не собираетесь использовать этот цикл, вы в значительной степени ДОЗИРУЕТЕ сами, не говоря уже о блокировке клиента.

Достаточно просто, создайте плагин для опроса:

Источник: 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);
0 голосов
/ 14 января 2013

Я думаю, что речь идет о пуш-сервере?

Как насчет использования 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

Ссылка: Fun с websockets, Node.js и jQuery (http://nayna.org/blog/?p=159)

0 голосов
/ 10 января 2010

Вам либо нужно перейти на метод опроса, как описано altCognito, либо вы можете использовать комету, которая предназначена для передачи данных с сервера на клиент. В зависимости от ваших потребностей, вы можете использовать что-то вроде Jetty (для Java) или Twisted (Python) или WebSync (ASP.NET/IIS)

0 голосов
/ 01 мая 2009

Используйте тайм-аут, эти типы циклов - действительно плохая идея, поэтому, если по какой-либо причине вам нужно использовать опрос, убедитесь, что вы не продолжаете молотить бэкэнд.

...