AJAX опрос и зацикливание - PullRequest
2 голосов
/ 21 марта 2012

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

Я написал цикл 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();

Ответы [ 2 ]

2 голосов
/ 21 марта 2012

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

РЕДАКТИРОВАТЬ: после просмотра кода я вижу, что вы используете нативный ajax, но для выбора используйте jQuery.Я предлагаю вам также использовать jQuery для ваших запросов ajax ( jQuery .ajax () Doku ).

Ваш код должен выглядеть примерно так:

function doAjaxLongpollingCall(){

   $.ajax({
     url: "...",
     timeout: <prettylong>,
     success: function(){
       //process your data
     },
     complete: function(){
       doAjaxLongpollingCall();
     }
   });
}
0 голосов
/ 22 марта 2012

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

...