2011-09-27 78 views
1

嗨,我试图用访问一个资源多次使用不同的参数的Javascript:XHR不处理多个异步请求

在这种情况下,要求

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报告这两个请求都已收到并可在资源窗格中查看。

此外,如果我使请求同步,那么它工作正常。然而,这是不被发布代码接受的,因为请求可能超时。

感谢

回答

8

使用var定义http_request。目前,您正在将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

谢谢,你能告诉我我不是一个JS家伙。 – 111111

+0

+1。 [JSLint](http://jslint.com)会选择这个。 – Quentin

+0

宁愿总是使用“严格使用”; –

0

实际上,可以运行多个异步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对象,并定义一个值xhrarray['xhr_'+item.mkdcck].uniqueid 获得其唯一的ID,并加载它的结果,你想要的。

希望能在未来帮助你。