Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在循环中更改readystate时,readystate更改太晚_Javascript_Asynchronous_Onreadystatechange - Fatal编程技术网

Javascript 在循环中更改readystate时,readystate更改太晚

Javascript 在循环中更改readystate时,readystate更改太晚,javascript,asynchronous,onreadystatechange,Javascript,Asynchronous,Onreadystatechange,我在一个循环中向GoogleMap服务器发出总共八个xmlhttprequests,并处理服务器返回的json对象以检索邮政编码。如果xmlhttprequests是同步的,那么代码可以正常工作。因为我应该使用异步请求,所以我尝试将代码转换为异步。它不起作用 我使用两个警报来监视myZip。当代码运行时,位于返回上方的第二个警报将运行八次,并将myZip显示为null或未定义,这就是返回的内容。然后,第一个警报运行八次并给出所需的邮政编码,不幸的是,太晚了。在我看来,readystate直到太晚

我在一个循环中向GoogleMap服务器发出总共八个xmlhttprequests,并处理服务器返回的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;
var url=”http://maps.googleapis.com/maps/api/geocode/json?address=“+地址+城市+州+”&sensor=false”;
请求打开(“获取”,url,true);
var-myZip;
req.onreadystatechange=函数()
{ 
如果(req.readyState==4&&req.status==200){
(功能(数据){
var myObj=eval(“(“+data+”)”);
如果(myObj.status==“OK”){

对于(i=0;i我猜您会多次使用同一对象(req),并且会在每个循环中被覆盖

因此,对每个请求使用单独的对象,或者在最后一个请求完成时启动一个新请求


在不知道req是什么的情况下,我不能确切地说你如何做到这一点。

我猜你使用同一个对象(req)几次,每次循环都会被覆盖

因此,对每个请求使用单独的对象,或者在最后一个请求完成时启动一个新请求


在不知道req是什么的情况下,我无法确切地说您如何做到这一点。

您应该使用回调而不是return语句,或者您应该将其作为分层JavaScript运行:。
然后,您可以像以前一样以同步方式编写它,即使它不会阻止您的浏览器。

您应该使用回调而不是返回语句,或者应该将其作为分层JavaScript运行:。
然后,您可以像您那样以同步方式编写它,即使它不会阻塞您的浏览器。

谢谢您的回复。req只是一个标准的xmlhttprequest(req=new xmlhttprequest();)我相信req不会被覆盖,因为我收到了八个警报(第一个警报被调用八次,显示所需的邮政编码)很抱歉,如果您认为一切正常,我帮不了您。使用标准xmlhttprequest处理同源策略也很神奇。感谢您的回复。req只是一个标准xmlhttprequest(req=new xmlhttprequest();),我相信req不会被覆盖,因为我收到了八个警报(第一个警报调用了八次,显示了所需的邮政编码。)抱歉,如果您认为一切正常,我帮不了您。使用标准xmlhttprequest处理相同来源的策略也很神奇。