Javascript: XHR не обрабатывает несколько асинхронных запросов - PullRequest
1 голос
/ 27 сентября 2011

Привет. Я пытаюсь получить доступ к одному ресурсу несколько раз с разными параметрами.

. В этом случае запрашивается

    var domains = [
    'host1',
    'host2'
    ];

    var requests = new Array();

    for ( i in domains )
    {
        requests[i]=new request(domains[i]);
    }

    function request(site)
    {
        var url = 'get_remote_status.php?host='+site;
        var queues = {};
        http_request = new XMLHttpRequest();
        http_request.open("GET", url, true, 'username', 'password');
        http_request.onreadystatechange = function () {
            var done = 4, ok = 200;
            if (http_request.readyState == done && http_request.status == ok) {
                queues = JSON.parse(http_request.responseText);
                var queuesDiv = document.getElementById('queues');
                print_queues(queues, queuesDiv, site);              
            }
        };
        http_request.send(null);
    }

. Однако код обрабатывает только один из запросов.лямбда.Chromium сообщает, что оба запроса были получены и доступны для просмотра на панели ресурсов.

Также, если я сделаю запрос синхронным, он будет работать нормально.Однако это не приемлемо для кода выпуска, поскольку время ожидания запроса может быть превышено.

Спасибо

Ответы [ 2 ]

8 голосов
/ 27 сентября 2011

Определите http_request, используя var.В настоящее время вы присваиваете объект XHR глобальной переменной.Из-за этого ваш скрипт может обрабатывать только один XHR за раз.

Соответствующий ошибочный код:

function request(site)
{
    var url = 'get_remote_status.php?host='+site;
    var queues = {};
    http_request = new XMLHttpRequest();

Предлагаемое изменение:

function request(site)
{
    var url = 'get_remote_status.php?host='+site;
    var queues = {};
    var http_request = new XMLHttpRequest(); //VAR VAR VAR !!!

Когда вы опускаете var перед переменной, переменная будет определена в глобальной области (window).Если вы используете var перед переменной, переменная определяется в локальной области (в данном случае в функции request).

0 голосов
/ 10 ноября 2014

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

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

var xhrarray={};
for (var j=0; j<itemsvals.length; j++){
                var labelval=itemsvals[j];
                // call ajax list if present.
                if(typeof labelval.mkdajaxlink != 'undefined'){
                    var divlabelvalue = '<div id="' + labelval.mkdid + '_' +          item.mkdcck + '" class="mkditemvalue col-xs-12 ' + labelval.mkdclass + '"><div class="mkdlabel">' + labelval.mkdlabel + ' :</div><div id="'+ j +'_link_'+ labelval.mkdid +'" class="mkdvalue">'+labelval.mkdvalue+'</div></div>';
                    mkdwrapper.find('#' + item.mkdcck + ' .mkdinstadivbody').append(divlabelvalue);

                    xhrarray['xhr_'+item.mkdcck] = new XMLHttpRequest();
                    xhrarray['xhr_'+item.mkdcck].uniqueid=''+ j +'_link_'+ labelval.mkdid +'';
                    console.log(xhrarray['xhr_'+item.mkdcck].uniqueid);
                    xhrarray['xhr_'+item.mkdcck].open('POST', labelval.mkdajaxlink);
                    xhrarray['xhr_'+item.mkdcck].send();
                    console.log('data sent');
                    xhrarray['xhr_'+item.mkdcck].onreadystatechange=function() {
                        if (this.readyState == 4) {
                            console.log(''+this.uniqueid);
                            document.getElementById(''+this.uniqueid).innerHTML = this.responseText;
                        }
                    };
                }
}

Вы должны установить каждый объект xhr в объекте глобальной переменной и определить значение xhrarray['xhr_'+item.mkdcck].uniqueid, чтобы получить его уникальный идентификатор и загрузить его результат, гдехочешь.

Надеюсь, это поможет тебе в будущем.

...