2011-03-23 7 views
0

저는 자바 스크립트에 익숙하지 않아서 다음 객체 속성이 전송되지 않는 이유를 알아낼 수 없습니다.자바 스크립트 - 객체 속성이 전송되지 않습니다.

다음과 같이 내가 객체를 호출 오전 :

var URL = "TABLE=_Products&COLUMNS=price_Qty,Sale&MATCH=internal_Model&ROWS="+itemnum ; 
var ITEM = new get_Database_Info(URL) ; 

을하고 get_Database_Info은 다음과 같습니다

function get_Database_Info(PARAMS) { 
    alert(toString(this)); 
    var URL = document.location.protocol+'//'+document.location.host+'/Catalog/Tools/ajax_Database_Request.php' ; 

    if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari 
      xmlhttp=new XMLHttpRequest(); 
     } 
    else{// code for IE6, IE5 
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 

    if(!xmlhttp){alert('Error: Cannot send XML request.');} 
     xmlhttp.onreadystatechange=function() { 

      if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
       alert(toString(this)); 
       var RESPONSE = xmlhttp.responseText ; 
       RESPONSE = RESPONSE.replace(/^\s+/, ''); 
       var ARR = RESPONSE.split('||') ; 
       ARR.pop() ; 
       for(var i=0; i<ARR.length; i++){ 
        var temparr1 = ARR[i].split('=') ; 
        var NUM = temparr1[0] ; 
        this[NUM] = new Array() ; 
         var temparr2 = temparr1[1].split('/|') ; 
         temparr2.shift() ; 
          for(var x=0; x<temparr2.length; x++){ 

           var temparr3 = temparr2[x].split('??') ; 

           this[NUM][temparr3[0]] = temparr3[1] ; 

          } 
       } 

      } 
     } 

    xmlhttp.open("POST", URL, true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xmlhttp.setRequestHeader("Content-length", PARAMS.length); 
    xmlhttp.setRequestHeader("Connection", "close"); 
    xmlhttp.send(PARAMS); 

}

나는 모든 속성 '이'내에있는 것을 확인했습니다 get_Database_Info의 범위이지만 ITEM으로 다시 전송되지 않습니다. 을 onreadystatechange에 연결된 함수가 this가 더 이상 생성자에서 생성되는하지만 아마도 전역 객체 또는 xmlhttp 객체에 부착 된 객체에 연결되어 있는지를 실행하지 않을 때

+0

문제는 비동기 요청을 호출하는 것이 었습니다. 나는 그것이 어떻게 모든 포스터에 TYVM 지금 작동하는지 본다. 이상하게도 특정 스크립트가 계속 실행되는 것은 사실이지만 객체가 먼저 해당 속성을 가져 오도록 요구했습니다. –

답변

0

언제 개체의 내용을 확인하고 있습니까? 요청은 비동기식이므로 객체에 속성이 있기 전에 콜백이 응답을 처리 할 때까지 기다려야합니다.

개체를 만든 직후에 속성을 보면 그 속성이 절대로 존재하지 않습니다. 응답이 정말 빨라지더라도 콜백을 처음 실행할 수있는 것은 객체를 생성 한 함수를 종료 할 때 브라우저가 컨트롤을 다시 가져 오는 것입니다.

0

나는 추측 벤처 것입니다. 코멘트에서 언급 한 바와 같이 당신이 for 루프 배열의 값 반복 될 때,

function get_Database_Info(PARAMS) { 
    alert(toString(this)); 
    var URL = document.location.protocol+'//'+document.location.host+'/Catalog/Tools/ajax_Database_Request.php' ; 

    if (window.XMLHttpRequest){// code for IE7+, Firefox, Chrome, Opera, Safari 
      xmlhttp=new XMLHttpRequest(); 
     } 
    else{// code for IE6, IE5 
      xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 

    var that=this; // value of that will be stored in the closure 

    if(!xmlhttp){alert('Error: Cannot send XML request.');} 
     xmlhttp.onreadystatechange=function() { 
      if (xmlhttp.readyState==4 && xmlhttp.status==200){ 
       alert(toString(that)); 
       var RESPONSE = xmlhttp.responseText ; 
       RESPONSE = RESPONSE.replace(/^\s+/, ''); 
       var ARR = RESPONSE.split('||') ; 
       ARR.pop(); 
       var arrLength = ARR.length; // always precompute array length 
       for(var i=0; i<ARR.length; i++){ 
        var temparr1 = ARR[i].split('=') ; 
        var NUM = temparr1[0] ; 
        // that is actually equal to the object that I created 
        // in the constructor. 
        that[NUM] = new Array() ; 
        var temparr2 = temparr1[1].split('/|') ; 
        temparr2.shift() ; 
        var arrayLength = temparr2.length; // always precompute length 
        for(var x=0; x<arrayLength; x++){ 
         var temparr3 = temparr2[x].split('??') ; 
         that[NUM][temparr3[0]] = temparr3[1] ; 
        } 
       } 
      } 
     } 

    xmlhttp.open("POST", URL, true); 
    xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    xmlhttp.setRequestHeader("Content-length", PARAMS.length); 
    xmlhttp.setRequestHeader("Connection", "close"); 
    xmlhttp.send(PARAMS); 

또한 당신은 length로 직접 사항 Array.length 사용해서는 안 : 나는 var that=this 패턴을 사용하려고 할 것 메서드는 루프를 통해 매번 호출되어 많은 불필요한 작업을 추가합니다.

또한 @Guffa는 값을 추가하는 함수를 비동기 적으로 호출하므로 XmlHttpRequest가 완료 될 때까지 속성이 존재하지 않으며 매우 위험한 반 패턴입니다. 나는 그것을 강력히 권고 할 것이다. 생성자가 데이터에 대한 동기식 요청을하는 것이 좋습니다.