Переход от setTimeout AJAX к длинному опросу с тайм-аутом - PullRequest
1 голос
/ 23 января 2012

Я создал сайт, который автоматически обновляет DIV каждые 15 секунд, используя timeOut.Это работает довольно надежно, но может потребоваться до 5 минут, прежде чем DIV будет фактически обновлено, что означает, что скрипт выполнит вызов 20 раз , прежде чем произойдет изменение.Довольно хорошая трата дорогостоящей полосы пропускания и производительности сервера:)

Я много читал о выполнении Long Polling вместо этого, и я попробовал.

Мой вызов AJAX был:

intval = window.setTimeout(function() {
  $.ajax({
    type: 'GET',
    cache: false,
    url: 'url',
    beforeSend: function() { $('#timerimg').attr('src', 'img/icons/loading.gif'); },
    success: function(data) { $('#ajaxcontent').html(data); },
    complete: function() { $('#timerimg').attr('src', 'img/icons/stop.gif'); }
  });
}, 15000);

Эта функция постоянно помещалась на обновляемой странице, поэтому функция тайм-аута постоянно повторялась.

Теперь я попытался следовать http://techoctave.com/c7/posts/60-simple-long-polling-example-with-javascript-and-jquery чтобы создать простую функцию длинного опроса

(function poll() { 
  $.ajax({ 
    type: 'GET',
    cache: false,
    url: 'url',
    success: function(data) { $('#ajaxcontent').html(data); },
    complete: poll,
    timeout: 30000
  });
})();

Если я установлю URL-адрес на hi.txt и сделаю эту запись Hello World!, то он постоянно завершается и проводит новый опрос.Что, очевидно, означает много одновременных опросов.

Как мне исправить это?

И:

Автообновление DIV - это большой графикс расчетами из огромного SQL-Server запроса.Поэтому, может быть, стоит просто проверить, было ли малейшее изменение в .getRows() (по сравнению с оригиналом) после SQL-запроса?

Я делаю все это в jQuery и ASP-Classic.

1 Ответ

2 голосов
/ 24 января 2012

Длинный опрос - не только клиентское решение.При длительном опросе сервер должен удерживать вызов, пока что-то не изменится.Это означает, что вы будете использовать одно из ваших одновременных подключений для КАЖДОГО клиента, вошедшего в систему. Это может быть проблемой с некоторыми поставщиками услуг, которые ограничивают параллелизм, поэтому проверьте свою политику ISP, прежде чем получить 503.

ТакжеВы решаете более одной проблемы здесь.Сервер должен отслеживать, нужно ли обновлять последний запрос или просто отправить вам обратно кэшированный ответ.Если вы используете длинный опрос, то сервер будет удерживать ваше соединение, пока оно не изменится.

Ранее вы использовали интервальный опрос.Я бы предложил продолжить этот маршрут (с кэшированием на стороне сервера) вместо того, чтобы выделять половину своей пропускной способности IE (максимум 2 одновременных) для нечастого обновления.Просто попросите сервер дать «ложный» ответ на ваш запрос, если что-то не изменилось.

...