2010-11-30 7 views
0

Ich gebe insgesamt acht xmlhttprequests an einen Google-Map-Server aus und verarbeitet die json-Objekte, die der Server zurückgibt, um die Postleitzahlen abzurufen. Der Code funktioniert einwandfrei, wenn die xmlhttprequests synchron sind. Da ich asynchrone Anfragen verwenden soll, versuche ich den Code asynchron zu konvertieren. Es funktioniert nicht.onreadystatechange in einer Schleife, readystate ändert sich zu spät

Ich verwende zwei Warnungen, um myZip zu überwachen. Wenn der Code ausgeführt wird, wird die zweite Warnung direkt über der Rückgabe acht Mal ausgeführt, und myZip wird als null oder undefiniert angezeigt und zurückgegeben. Dann läuft der erste Alarm achtmal und gibt die gewünschte Postleitzahl, leider zu spät. Es scheint mir, dass sich der Fertigzustand erst zu spät ändert.

Wie sollte ich den Code ändern, so dass es die Postleitzahl zurückgibt, nicht null? Jede Hilfe wird sehr geschätzt.

var url = "http://maps.googleapis.com/maps/api/geocode/json?address="+address+city+state+"&sensor=false"; 

req.open("GET", url,true); 

var myZip; 

req.onreadystatechange = function() 
{ 
     if(req.readyState == 4 && req.status == 200) { 
     (function(data){ 
      var myObj = eval('(' + data + ')'); 
      if(myObj.status=="OK"){  
        for(i=0; i <myObj.results[0].address_components.length; i++){ 
        if(myObj.results[0].address_components[i].types=="postal_code"){ 
        myZip=myObj.results[0].address_components[i].long_name; 
        alert('zip is '+myZip); 
        } 
       } 
      }  
      else  
      { 
      alert("Error: returned status code "+req.status+" "+req.statusText); 
      } 
     })(req.responseText); 
    } 
} 
req.send(); 
alert(myZip); 
return myZip; 

Antwort

0

Ich vermute, dass Sie das gleiche Objekt (req) ein paar Mal verwenden und in jeder Schleife überschrieben werden.

Verwenden Sie also für jede Anfrage separate Objekte oder starten Sie eine neue Anfrage, wenn die letzte fertig ist.

Wie genau können Sie das tun, kann ich nicht sagen, ohne zu wissen, was req ist.

+0

Danke für die Antwort. req ist nur ein Standard xmlhttprequest (req = new XMLHttpRequest();) Ich glaube, die Req wird nicht überschrieben, weil ich acht Warnungen (die erste Warnung wird acht Mal aufgerufen wird, zeigt die gewünschte Postleitzahl.) – yky

+0

Sorry, wenn Sie das glauben alles ist in Ordnung, ich kann dir nicht helfen. Es ist auch magisch, wie man mit einem standard xmlhttprequest um die self-origin-policy herumkommt. –

1

Sie sollten entweder einen Rückruf anstelle von return statement verwenden, oder Sie sollten dies als geschichtetes JavaScript ausführen: http://stratifiedjs.org. Dann können Sie es auf eine synchrone Art und Weise schreiben, wie Sie es taten, obwohl es Ihren Browser NICHT blockieren wird.

Verwandte Themen