0

緯度、経度に対応する住所を変数(javascript)に格納しようとしています。コールバック関数を作成しました (多数の投稿を読んだ後)。コードは次のとおりです。ここで、住所を location3 という変数に格納します。

奇妙なことに、location3 が割り当てられた直後のアラートでは、それは未定義です。しかし、300 ミリ秒後に見ると、正しい値が得られます。location3 に割り当てられたアドレスをすぐに取得したい。どんな提案でも大歓迎です。

  function codeLatLng1(lat,long,callback) {
  var geocoder = new google.maps.Geocoder();
  var latlng = new google.maps.LatLng(lat,long);
  if (geocoder) {
    geocoder.geocode({'latLng': latlng}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        if (results[1]) {
          callback(results[1].formatted_address);
          myvariable=results[1].formatted_address;
        } else {
          alert("No results found");
        }
      } else {
        alert("Geocoder failed due to: " + status);
      }
    });
  }
}


lat1_last=37;long1_last=-100;
codeLatLng1(lat1_last,long1_last,function(locat) {location3=locat;});
alert (location3); // THIS ALERT SHOWS THAT IT IS STILL UNDEFINED
setTimeout(function(){alert (location3);},300);  // THIS ALERT GIVES THE RIGHT ADDRESS
4

1 に答える 1

0

ここで理解しておくべきことは、geocode() の 2 番目の引数であるコールバック関数がすぐに呼び出されるのではなく、Google から結果を受け取った後でのみ呼び出されるということです。一方、関数 codeLatLng1() は、リクエストを送信した後、制御を呼び出し元に返します。プログラムでは、最初の alert() が次に発生し、その後、Google からの返信、コールバックの呼び出しなどの待機時間が続くことを意味します。

同様に、location3 を設定する匿名コールバックは、codeLatLng1 が返される前ではなく、その結果が受信されたときにのみ実行されます。

匿名のコールバック内にアラートを配置する方が理にかなっています。通常、これは結果の最終処理が行われる場所です。

これは、非同期またはイベント駆動型プログラミングの例です。

これで明確になることを願っています!

于 2013-07-09T23:26:22.700 に答える