2012-04-29 4 views
2

У вас есть понимание проблемы? При запуске код ничего не дает. На странице не отображается текст. Если я раскомментирую прокомментированную строку, появятся результаты xml. Почему я не могу передать это как переменную? (Я получаю предупреждение, FYI, поэтому функция вызывается.)Не удается вернуть 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, вы должны просто использовать its builtin AJAX functionality вместо создания пользовательского XMLHttpRequest.

+0

Вы можете просто передать функцию как параметр по имени? Хороший Бог. Исходя из C ... вы даже не знаете, что это такое. – Aerovistae

+0

На самом деле, вы делаете x86, так что вы можете точно знать, что это такое. Отличный ответ, кстати. – Aerovistae

+0

О да, я знаю :) Но вся эта радость исчезает, когда вы понимаете, что потеряли почти все данные, и компилятор не сказал вам, что «обратный вызов ожидает FooObject, вы дали ему строку» (хотя Google Closure - хорошее начало). Компромиссы везде;) – DCoder

1

С одной стороны, у вас есть вопросы капитализации, т.е. xmlresults против xmlResults

+0

Это была просто опечатка в вопросе; не было в коде. Исправлена. – Aerovistae