我在循环中向Google地图服务器发出总共八个xmlhttprequests,并处理服务器返回的json对象以检索邮政编码。如果xmlhttprequests是同步的,则代码可以正常工作。因为我应该使用异步请求,所以我试图将代码转换为异步。它不起作用。
我使用两个警报来监控myZip。运行代码时,返回正上方的第二个警报运行八次,并将myZip显示为null或undefined,这就是返回的内容。然后,不幸的是,第一个警报运行八次并提供所需的邮政编码,为时已晚。在我看来,状态不会改变,直到为时已晚。
我应该如何修改代码以便它返回邮政编码,而不是空?任何帮助将不胜感激。
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;
答案 0 :(得分:1)
您应该使用回调而不是return语句,或者应该将其作为分层JavaScript运行:http://stratifiedjs.org。 然后你就可以像同样的方式一样编写它,即使它不会阻止你的浏览器。
答案 1 :(得分:0)
我猜你会使用相同的对象(req)几次,并且会在每个循环中被覆盖。
因此,请为每个请求使用单独的对象,或者如果最后一个请求已完成,则启动新请求。
你怎么能做到这一点我不能不知道什么是req。