1

Google マップ サーバーに対して合計 8 つの xmlhttprequest をループで発行し、サーバーが返す json オブジェクトを処理して郵便番号を取得します。xmlhttprequests が同期している場合、コードは正常に機能します。非同期リクエストを使用することになっているので、コードを非同期に変換しようとしています。うまくいきません。

myZip を監視するために 2 つのアラートを使用します。コードが実行されると、リターンのすぐ上にある 2 番目のアラートが 8 回実行され、myZip が null または未定義として表示され、それが返されます。その後、最初のアラートが 8 回実行され、目的の郵便番号が表示されますが、残念ながら遅すぎます。私には、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

同じオブジェクト(req)を数回使用すると、ループごとに上書きされると思います。

そのため、リクエストごとに個別のオブジェクトを使用するか、最後のリクエストが終了したら新しいリクエストを開始してください。

これをどの程度正確に行うことができるかは、req が何であるかを知らずに言うことはできません。

于 2010-11-30T17:30:09.383 に答える