2011-11-14 15 views
1

Google Mapsのジオコードを使って、このアドレス文字列をLatLngオブジェクトに変換しようとしています。私は、それが非同期呼び出しであるため、latlngにnullが割り当てられると信じています。変数の割り当てを私が望むように動作させるにはどうすればよいですか?このジオコード要求を変数に割り当てる方法を教えてください。

var latlng = codeAddress(address) 
alert("Lat/lng is: " + latlng); 

function codeAddress(address) { 
     geocoder.geocode({'address':address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      return results[0].geometry.location; 
     } else { 
      alert("Geocode failed due to: " + status); 
     } 
     }); 
    } 

答えて

3

geocode()は非同期であるため、これも同期的に呼び出す方法はありません。したがって、var latlng = codeAddress(address);ではありませんです。関数内でジオコーディングの結果を使用する必要があります。考えてみましょう:

var latlng = null; 
function codeAddress(address) { 
     geocoder.geocode({'address':address}, function(results, status) { 
     if (status == google.maps.GeocoderStatus.OK) { 
      latlng = results[0].geometry.location; // use latlng here ..., e.g.: 
      alert("Lat/lng is: " + latlng); 
     } else { 
      alert("Geocode failed due to: " + status); 
     } 
     }); 
    } 

コールcodeAddress(address)は、グローバル変数latlngに割り当てます。しかし、問題は、割り当てがいつ発生するのかわからないことです。上記のケースでは、アラートボックスが表示された後にのみわかります。

一般的なアプローチは、コールバック内のジオコーディングの結果を処理することです。結果を使用してHTMLフィールドに入力します。

+0

ご回答ありがとうございます。私がしようとしているのは、ステータスコードが成功すればGoogleマップをレンダリングし、それ以外の場合は地図をレンダリングしません。別のものが終了するまでjavascript関数/代入ブロックを作る方法はありますか?あるいは、私はこれとは別の方法で進む必要がありますか? –

+1

ジオコードコールバック内で関数を呼び出すことができます。つまり、 'alert(latlng) 'の代わりに' render(latlng) 'を呼び出すことができます。 – Jiri

+0

3年後にこれはまだ有効な答えです。ありがとう! – Kaloyan

関連する問題