0

このトピックについては非常に多くのスレッドがありますが、私のケースに適した答えをまだ見つけることができませんでした...

これが私がやろうとしていることです:

1) Google Maps API v3 でジオコードを取得する関数を定義する

2) この特定の住所のジオコードを取得するために、問題の住所で関数を呼び出します

配置すると、コードは完全に正常に機能します

    alert(address); 

    address = results[0].geometry.location;

グローバル変数として必要なので、残念ながらこれはオプションではありません。「アドレス」変数を​​グローバル関数として使用しようとすると、常に値が「未定義」になります。

<!DOCTYPE html>
<html>
<head>
  <script src="http://maps.googleapis.com/maps/api/js?sensor=false"
      type="text/javascript"></script>
</head>

  <script type="text/javascript">
    var geocoder;
    var address;

     address = 'Frankfurt, Germany';

  function codeAddress() {
    geocoder = new google.maps.Geocoder();
    geocoder.geocode( { 'address': address}, function(results, status) {
  if (status == google.maps.GeocoderStatus.OK) {

address = results[0].geometry.location;


  } else {
    alert("Geocode was not successful for the following reason: " + status);
      }
    });
  }

codeAddress(address);
alert(address);

  </script>


</body>
</html>

これで私を助けることができる人はいますか?コードをじっと見つめても、私はどこにも行けないようです。利用可能なすべてのヘルプに感謝します、ありがとう!!!

4

2 に答える 2

0

問題はそれgeocode非同期であることですよね?

これは、ジオコード コールバックが「後で」呼び出されることを意味します。これは、元の投稿の外部変更が最初に呼び出された後のことです。(最初に特定の文字列に設定されているため、 undefined を警告するべきではないため、そのステートメントは無視します。)

function codeAddress() {
  geocoder = new google.maps.Geocoder();
  geocoder.geocode( { 'address': address}, function(results, status) {
    if (status == google.maps.GeocoderStatus.OK) {
      // Only use address *after the callback success* and get rid of
      // the global variable if possible - note how it's just passed here.
      // You can use `debugger;` to stop here and check the value to
      // make sure it is set as appropriate.
      var address = results[0].geometry.location;
      alert(address);
      doOtherStuffWithAddress(address);
    } else {
      alert("Geocode was not successful for the following reason: " + status);
    }
  });
}

function doOtherStuffWithAddress (address) {
   // don't need no stinking globals
}

AJAX 呼び出しから応答を返す方法を参照してください。:

AJAX の A は非同期を表します。つまり、リクエストの送信 (またはレスポンスの受信) は、通常の実行フローから除外されます。あなたの例では、 $.ajax はすぐに戻り、次のステートメント return result; は、成功コールバックとして渡した関数が呼び出される前に実行されます。

そしてコンテキストに特化:

ジオコード機能は非同期です。つまり、リクエストの送信 (またはレスポンスの受信) は、通常の実行フローから除外されます。あなたの例では、ジオコードはすぐに戻り、次のステートメント alert(address) は、成功コールバックとして渡した関数が呼び出される前に実行されます。

于 2013-05-13T20:47:03.537 に答える
0

答えてくれてありがとう。私は今、私のプロジェクトを完成させることができました!!! 以下の最終的なコードを見つけてください。このコードは、住所の配列のジオコードを入力します。楽しむ。

<!DOCTYPE html>
<html>
<head>
  <script src="http://maps.googleapis.com/maps/api/js?sensor=false"
          type="text/javascript"></script>
</head>
<BODY>
<DIV ID="pro"></div>
<DIV ID="adr"></div>

  <script type="text/javascript">
    var geocoder;




var addresses = "Berlin, Deutschland; Frankfurt, Deutschland; Broadway Street, New York City, New York, USA";


 geocoder = new google.maps.Geocoder();

var address = addresses.split(';');

var i = 0;
var timeout = 600;


codeAddress(i);


function codeAddress(i) {


    geocoder.geocode( { 'address': address[i]}, function(results, status) 
    {
            if (status == google.maps.GeocoderStatus.OK) {
            document.getElementById("adr").innerHTML = document.getElementById("adr").innerHTML + "<BR>{location: new google.maps.LatLng" + results[0].geometry.location + ", weight: 1},";

                                } else {
                if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT)
                    {
                        setTimeout(function() { addMarker(position); }, (timeout * 3));
                    }
                                        }


i++;
var percent = ((i) / address.length) * 100;
percent = percent.toFixed(2);
percent = percent + " %";
document.getElementById("pro").innerHTML = percent; 


if (i < address.length)
        {
            setTimeout(function() { codeAddress(i); }, (timeout));
         }

    });



            }

</script>


</body>
</html>
于 2013-05-28T11:56:45.177 に答える