2011-09-27 5 views
1

안녕하세요 요청 중의 하나되고있는, 그러나자바 스크립트 : 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); 
    } 

를 요청하는 다른 매개 변수이 경우

와 함께 하나 개의 자원을 여러 번에 액세스하려고 코드 람다에 의해 처리된다. Chromium은 두 요청을 모두 받았고 자원 창에서 볼 수 있다고보고합니다.

또한 요청을 동기로 만들면 문제가 없습니다. 그러나 요청이 시간 초과 될 수 있으므로 릴리스 코드에서 허용되지 않습니다.

감사

답변

8

var를 사용하여 http_request을 정의합니다. 현재 XHR 객체를 전역 변수에 할당하고 있습니다. 이 때문에 스크립트는 한 번에 하나의 XHR 만 처리 할 수 ​​있습니다.

관련 오류 코드 :

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

제안 된 변경 사항 : 당신이 변수 전에 var를 생략하면

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

, 변수는 전역 (window) 범위로 정의됩니다. 변수 앞에 var을 사용하면이 변수는 로컬 범위 (함수 request)에 정의됩니다.

+0

고마워, 내가 JS 녀석이 아니라고 말할 수 있니? – 111111

+0

+1. [JSLint] (http://jslint.com)이이를 선택했을 것입니다. – Quentin

+0

항상 'use strict'를 사용하는 것을 선호합니다. –

0

사실 여러 개의 비동기 xhr 호출을 실행할 수 있지만 DOM에 로컬로 저장하고로드 할 수 있으려면 매개 변수로 고유 한 ID를 지정해야합니다.

예를 들어, 배열에 루프를 만들고 각 객체에 대해 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 객체를 설정하고 고유 ID를 얻을 당신이 원하는 그 결과를로드하는 값 xhrarray['xhr_'+item.mkdcck].uniqueid 을 정의해야합니다.

희망은 앞으로 도움이 될 것입니다.

관련 문제