альтернатива setInterval - PullRequest
       10

альтернатива setInterval

0 голосов
/ 15 марта 2010

В моем приложении я опрашиваю веб-сервер на предмет сообщений каждую секунду и отображаю их во внешнем интерфейсе. Я использую setInterval для достижения этой цели. Однако, пока пользователь остается на этой странице, клиент продолжает опрашивать сервер с помощью запросов, даже если данных нет. Сервер дает указание, когда больше сообщений не генерируется, устанавливая переменную. Я думал об использовании этой переменной, чтобы очиститьInterval и остановить таймер, но это не сработало. Что еще я могу использовать в этой ситуации? Я использую JQuery и Django. Вот мой код:

jquery:
 var refresh = setInterval(
        function ()
            {
                var toLoad = '/myMonitor'+' #content';             
                $('#content').load(toLoad).show();

            }, 1000); // refresh every 1000 milliseconds
    });

html:
div id=content is here 

Я могу получить доступ к переменной django для завершения в html при каждом обновлении. Как я могу установить clearInterval, если вообще?

Примечание: переполнение стека не позволяет мне поставить is & gt & lt, поэтому html не завершен

Спасибо

Обновлено 03/16/2010 Я должен делать что-то не так. Но не могу понять это. Вот мой скрипт с clearTimer, и он не работает.


var timer = null;
$(function(){
        if ("{{status}}" == "False")
        {
           clearInterval(timer);
        }
        else
        {
            timer = setInterval(
                function(){
                    var toLoad = '/myMonitor'+' #content';  
                    $('#content').load(toLoad).show();} 
                    ,1000); // refresh every 1000 milliseconds
        }
    });

status является логическим набором в "views.py" (Django). Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 15 марта 2010

Несколько человек уже ответили с конкретными ресурсами на вашу проблему, поэтому я подумал, что я бы немного рассказал об этом.

Короче говоря, вы хотите, чтобы сервер отправлял данные в браузер, чтобы избежать обширного опроса на стороне клиента. Не существует хорошего кросс-браузерного способа поддержки push-запросов на сервере, поэтому распространенное решение, которое требует гораздо меньшего количества опросов, - это использование метода длинных опросов Comet (другого чистящего средства, такого как AJAX).

С Comet браузер отправляет запрос, и сервер сохраняет соединение открытым, не отвечая, пока не появятся новые данные. Когда сервер делает новые данные, он отправляет их через открытое соединение, и браузер получает их сразу. Если время соединения истекло, браузер откроет новое. Это позволяет серверу отправлять данные клиенту, как только они становятся доступными. Как указали другие, этот подход требует специальной настройки вашего веб-сервера. Вам нужен скрипт на сервере, который проверяет данные с интервалом и отвечает клиенту, если они существуют.

При таком подходе следует иметь в виду, что большинство веб-серверов построены так, чтобы получать запросы от клиентов и отвечать максимально быстро; они не предназначены для сохранения в течение длительного периода времени. С Comet у вас будет гораздо больше открытых соединений, чем обычно, возможно, они потребляют больше ресурсов, чем вы ожидаете.

0 голосов
/ 16 марта 2010

Ваша проверка clearInterval проверяется только при возникновении события готовности документа.

Если код, который вы дали, в точности соответствует тому, что есть в браузере, то вы сравниваете строку "{{status}}" со строкой "False". Я предпочел бы посмотреть, как краска высохнет, чем ждать, пока это оценит как истинное.

Что если выполнение ваших запросов занимает более 1 секунды? : Вы заполняете свой сервер запросами.

function update () {
  $('#content').show().load('/myMonitor'+' #content', function (response, status) {
    if (!/* whatever you're trying to check*/) {
      setTimeout(update, 1000);
    };
  });
};

$(document).ready(function () {
  update();
});

Ближе, чем вы были, но вам все еще нужно решить, как вы будете решать, когда вы хотите прекратить опрос.

...