1

我在一个循环中向 Google 地图服务器发出总共 8 个 xmlhttprequest,并处理服务器返回的 json 对象以检索邮政编码。如果 xmlhttprequests 是同步的,则代码可以正常工作。由于我应该使用异步请求,因此我正在尝试将代码转换为异步。它不起作用。

我使用两个警报来监控 myZip。运行代码时,返回正上方的第二个警报运行八次并将 myZip 显示为 null 或未定义,这就是返回的内容。然后第一个警报运行八次并给出所需的邮政编码,可惜为时已晚。在我看来,readystate 直到为时已晚才会改变。

我应该如何修改代码以使其返回邮政编码,而不是 null?任何帮助将不胜感激。

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;
4

2 回答 2

1

您应该使用回调而不是 return 语句,或者您应该将其作为 Stratified JavaScript 运行:http ://stratifiedjs.org 。然后,您可以像您所做的那样以同步方式编写它,即使它不会阻止您的浏览器。

于 2010-12-04T10:02:12.613 回答
0

我猜你多次使用相同的对象(r​​eq)并且将在每个循环中被覆盖。

因此,为每个请求使用单独的对象,或者如果最后一个请求完成,则启动一个新请求。

如果不知道 req 是什么,我不能说你究竟能做到这一点。

于 2010-11-30T17:30:09.383 回答