2012-03-21 3 views
2

Мой проект в основном похож на фид Reddit, который обновляется в режиме реального времени. Я пытаюсь использовать AJAX для периодического опроса сервера с обновлениями по 15 элементам за раз.Опрос и цикл AJAX

Я написал цикл for, но это заставило браузер заблокировать (я угадываю слишком много XHR?).

Как я могу опросить каждый элемент в корте Reddit-esque без блокировки браузера? Каков наиболее эффективный способ сделать это?

Должен ли я использовать длинный опрос, если в течение более 100 клиентов работает веб-приложение? Или я должен выбрать интеллектуальный опрос (увеличение времени ожидания между запросами, если нет данных)?

Спасибо! Я все еще новичок в AJAX!

for (var i=0; i < id_array_len; i++) { 
     // Grab current reply count 

     var reply = $("#repl"+item_id).html(); 
     var url= *php function here* 

     var ajaxRequest; 

     try{ 
      // Opera 8.0+, Firefox, Safari 
      ajaxRequest = new XMLHttpRequest(); 
     } catch (e){ 
      // Internet Explorer Browsers 
      try{ 
       ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP"); 
      } catch (e) { 
       try{ 
        ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP"); 
       } catch (e){ 
        // Something went wrong 
        alert("Your browser does not support AJAX!"); 
        return false; 
       } 
      } 
     } 

     ajaxRequest.onreadystatechange = function(){ 
      if (ajaxRequest.readystate == 4){ 
       live_feed_data_tot = ajaxRequest.responseText; 

       if (live_feed_data_tot.trim() == "no change" || live_feed_data_tot.trim() == "no meme" || live_feed_data_tot.trim() == "no response"){ 

        console.log("(no update)"); 

       } else { 

        var live_feed_data = live_feed_data_tot.split(','); 
        if (live_feed_data[1] == 'reply') { 
         // Reply count has changed 
         new_reply = live_feed_data[0].trim(); 

         // Update actual number 
         $("#repl"+item_id).html(new_reply); 

        } 
       } 
      } 
     } 

     ajaxRequest.open('POST', url, true); 
     ajaxRequest.send(); 
+0

Покажите нам петлю. Я сделал именно это несколько раз, не блокируя браузер, поэтому я ожидаю, что это что-то в вашем коде. –

+0

Добавлен код - помощь будет очень признательна! –

ответ

2

Использовать longpolling с длинным (подходящим для вашего приложения, конечно) таймаутом. Конечно, ваш вызов должен быть асинхронным. Пока нет данных для доставки, сервер вернет ответ, пока не будет достигнут тайм-аут. Как только клиент получит ответ, запустите следующий длинный палец в своем complete() -Block. Таким образом, вы можете свести к минимуму количество запросов.

EDIT: после просмотра кода я вижу, что вы используете собственный аякс, но используете jQuery для выбора. Я предлагаю вам использовать jQuery для ваших аякс-запросов (jQuery .ajax() Doku).

Ваш код должен выглядеть следующим образом:

function doAjaxLongpollingCall(){ 

    $.ajax({ 
    url: "...", 
    timeout: <prettylong>, 
    success: function(){ 
     //process your data 
    }, 
    complete: function(){ 
     doAjaxLongpollingCall(); 
    } 
    }); 
} 
+0

Спасибо за предложения. Два вопроса, если вы не возражаете ответить ... 1) Я слышал, что длительный опрос не очень масштабируемый, когда клиенты> 100+. Это правда? 2) Спасибо за предложение jQuery - просто интересно, почему вы предлагаете мне использовать jQuery для моих запросов AJAX? Благодарим за ваше терпение! –

+0

@ TheJagganator Я не возражаю: 1. Да, longpolling имеет решающее значение, потому что каждый клиент отправляет запросы на сервер независимо от того, есть ли данные для извлечения или нет. Тем не менее, нет альтернатив, если вам действительно нужны обновления в реальном времени. Вам необходимо настроить его (например, установить таймауты соответственно). Btw. даже огромные порталы используют longpolling. 2. JQuery делает для вас всю грязную работу (нет необходимости в браузерах, обратных вызовах и т. Д.). Эффективно вы можете написать jQuery Ajax Requests в 3Lines, где вам нужно 20Lines родной JS. – Christoph

+0

@ TheJagganator Если вам интересно, вы можете прочитать в [SPDY] (http://www.chromium.org/spdy). Firefox11 уже имеет его, конечно, Chrome, и даже Apache-Server поддерживает его. Тем не менее, очень экспериментально. – Christoph

0

Если вы делаете много пользователей, переключитесь на socket.io и избавить себя от хлопот. Он использует websockets (который использует механизм push) и выполняет резервное копирование на другие механизмы, такие как flash-сокеты или длительный опрос, если они недоступны в браузере. Однако вы должны создать эту часть своего приложения в node.js.

+0

Так как веб-порты не поддерживаются IE, это в значительной степени сводится к ajax longpolls (или, возможно, flash, если установлен). Выглядит интересно, может быть, я попробую. – Christoph

+0

Вот почему он автоматически падает без какого-либо взаимодействия с разработчиком. Обеспечивает совместимость с IE6 и выше. –