Javascript:XHR不处理多个异步请求

Javascript:XHR不处理多个异步请求,javascript,ajax,asynchronous,xmlhttprequest,Javascript,Ajax,Asynchronous,Xmlhttprequest,嗨,我正在尝试使用不同的参数多次访问一个资源 在这种情况下,请求 var domains = [ 'host1', 'host2' ]; var requests = new Array(); for ( i in domains ) { requests[i]=new request(domains[i]); } function request(site) { var url

嗨,我正在尝试使用不同的参数多次访问一个资源

在这种情况下,请求

    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);
    }
但是,代码lambda只处理其中一个请求。Chromium报告两个请求都已收到,可在资源窗格中查看

另外,如果我使请求同步,那么它可以正常工作。但是,这对于发布代码来说是不可接受的,因为请求可能会超时

感谢使用var定义http_请求。目前,您正在将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时,该变量将在全局窗口范围中定义。如果在变量之前使用var,则在函数请求的本地范围内定义变量。在本例中,使用var定义http\U请求。当前,将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时,该变量将在全局窗口范围中定义。如果在变量之前使用var,则该变量在函数请求的本地范围内定义。

事实上,可以运行多个异步xhr调用,但必须给它们一个唯一的id作为参数,以便能够在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对象,并定义一个值XHRARAY['xhr\UUX'+item.mkdcck].uniqueid 获取其唯一id并将其结果加载到所需的位置


希望这将在将来对您有所帮助。

事实上,可以运行多个异步xhr调用,但您必须给它们一个唯一的id作为参数,以便能够在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对象,并定义一个值XHRARAY['xhr\UUX'+item.mkdcck].uniqueid 获取其唯一id并将其结果加载到所需的位置


希望这能对你以后有所帮助。

谢谢,你能告诉我我不是JS人。我更喜欢使用“严格使用”;谢谢,你能告诉我我不是一个JS的家伙。喜欢总是使用'严格使用';