2011-09-27 108 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,並加載它的結果,你想要的。

希望能在未來幫助你。