2012-04-29 3 views
2

여기에 대한 통찰력이 있으십니까? 코드를 실행하면 아무 것도 산출되지 않습니다. 페이지에 텍스트가 표시되지 않습니다. 주석 처리 된 행의 주석을 제거하면 xml 결과가 나타납니다. 왜 그것을 변수로 전달할 수 없습니까? (함수가 호출되고, 그래서 내가 참고로, 경고를받을 수 있나요.)xmlhttp.responseText를 반환 할 수 없습니까?

<script type="text/javascript"> 
      function loadXMLDoc(parameterString) 
       { 
        alert("loadXMLDoc has been called."); 
        var xmlhttp = new XMLHttpRequest(); 

        xmlhttp.onreadystatechange=function() 
        { 
         if (xmlhttp.readyState==4 && xmlhttp.status==200) 
         { 

        //document.getElementById("xmlResults").innerHTML = xmlhttp.responseText; 
           alert("Got the response!"); 
           return xmlhttp.responseText; 
          } 
          else document.getElementById("xmlResults").innerHTML = "No results." 
         } 

         var url = "http://metpetdb.rpi.edu/metpetwebsearchIPhone.svc?" + parameterString; 
        xmlhttp.open("GET",url,true); 
        xmlhttp.send(); 
       } 
     </script> 



     <script type="text/javascript"> 

     $(function(){ 

     //left out irrelevant code which creates the var "parameters" 

     var results = loadXMLDoc(parameters); 

     document.getElementById("xmlresults").innerHTML = results; 

     }); 


     </script> 


<body> 
<div id="xmlResults"></div> 
</body> 
+0

아! 비동기 호출에서 변수를 반환 할 수 없다는 추가 정보가 있습니다. 헬퍼 함수를 ​​사용해야합니다. 이것은 절대적으로 불가피하게 사실입니까? – Aerovistae

답변

4

는 비동기 호출은 수행 대 호출자가 결과를 기다리지 않고 실제 작업을 수행 할 수 있습니다. 당신은 예를 들어, 콜백 함수를 사용할 필요가 않습니다

<script type="text/javascript"> 
    function loadXMLDoc(parameterString, onComplete, onError) { 
    alert("loadXMLDoc has been called."); 
    var xmlhttp = new XMLHttpRequest(); 

    xmlhttp.onreadystatechange=function() { 
     if (xmlhttp.readyState==4) { 
     if(xmlhttp.status==200) { 
      //document.getElementById("xmlResults").innerHTML = xmlhttp.responseText; 
      alert("Got the response!"); 
      onComplete(xmlhttp.responseText); 
     } else { 
      onError(); 
     } 
     } 
    }; 

    var url = "http://metpetdb.rpi.edu/metpetwebsearchIPhone.svc?" + parameterString; 
    xmlhttp.open("GET",url,true); 
    xmlhttp.send(); 
    } 
</script> 

<script type="text/javascript"> 
    $(function(){ 
    //left out irrelevant code which creates the var "parameters" 
    loadXMLDoc(parameters, function(results) { 
     // this function will be called if the xmlhttprequest received a result 
     document.getElementById("xmlresults").innerHTML = results; 
    }, function() { 
     // this function will be called if xhr failed 
     document.getElementById("xmlResults").innerHTML = "No results."; 
    }); 
    }); 
</script> 

을 그건 그렇고, 당신은 이미 jQuery를 사용하고 있기 때문에, 당신은 단지 사용자 정의 XMLHttpRequest를 구축하는 대신 its builtin AJAX functionality를 사용해야합니다.

+0

함수를 매개 변수로 그처럼 이름으로 전달할 수 있습니까? 좋은 하나님 JavaScript는 훌륭합니다. C에서 오면 ...이게 뭔지조차 몰라. – Aerovistae

+0

사실, x86을 사용하기 때문에 이것이 무엇인지 정확하게 알 수 있습니다. 그런데 중대한, 중대한 응답. – Aerovistae

+0

오 그래, 할 수있다. 그러나 거의 모든 데이터 유형을 잃어 버렸음을 깨달았을 때 "그 콜백이 FooObject를 기대하고, 문자열을 주었다"고 말할 컴파일러가 없다면 기쁨이 사라진다. (Google 클로저는 좋은 시작이지만). 어디에서나 절충;) – DCoder

1

한 가지를 들어, 총액 문제가, 즉 xmlresults는 정의에 의해 xmlResults

+0

그것은 단지 질문의 오타였습니다. 코드에 존재하지 않았다. 결정된. – Aerovistae