0

私は他の誰かのコードに取り組んでおり、Google マップ API を使用して住所を緯度と経度の座標に変換しようとしています: var start_lng; var end_lat; var end_lng; getLat(開始); getLng(開始);

  function getLat(loc) {
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'address': loc}, function postcodesearch(results, status) 
    {   
      if (status == google.maps.GeocoderStatus.OK) 
    {
      var lat = results[0].geometry.location.lat();
      alert(lat);
      return lat;

      //alert(start_lng);
    }
  else {
    alert("Error");
  }
  });
 }
function getLng(loc) {
var geocoder_lng = new google.maps.Geocoder();
  geocoder_lng.geocode({'address': loc}, function postcodesearch(results, status) 
{   
  if (status == google.maps.GeocoderStatus.OK) 
{
  var lng = results[0].geometry.location.lng();
  alert(lng);
  return lng;

}
  else {
 alert("Error");
   }
    });
    }

ここまでは順調ですね。以下のコードでは、その緯度と経度を取得し、それらを使用してさまざまな計算を実行します。

  alert("DO REST");
  var start_p = new google.maps.LatLng(start_lat, start_lng);
  alert(start_p);
  var end_p = new google.maps.LatLng(end_lat, end_lng);

問題は、緯度と経度を取得する呼び出しが非同期であるため、以下のコードが値を使用する前に値を取得するのを待たないことです。それらは未定義として表示されます。コードの後半を独自の関数に入れて、経度リクエストの最後にそれを呼び出してみましたが、経度の呼び出しが最初に終了した場合にのみ機能しました。$.ajax({ async:false}) も試しましたが、何もしませんでした。AJAX を扱うのはこれが初めてなので、どの方法を使用すればよいかわかりません。

4

2 に答える 2

1

「ハンドラ」コードについては、代わりにコールバックを使用します。

function getLatLng(loc, callback) {
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({'address': loc}, function postcodesearch(results, status) 
    {   
        if (status == google.maps.GeocoderStatus.OK) 
        {
            var lat = results[0].geometry.location.lat();
            var lng = results[0].geometry.location.lng();
            callback(lat, lng);
        }
    }
}

getLatLng(function(lat, lng) {
    alert("DO REST");
    var start_p = new google.maps.LatLng(lat, lng);
});

ジオコーダに対して 2 つの呼び出しを行う必要がある場合は、いつでもそれらの呼び出しをネストし、両方が完了した後にコールバックを配置できます。何かのようなもの:

function getLatLng(locStart, locEnd, callback) {
    geocoder.geocode({ }, function(results1) {

        geocoder.geocode({ }, function(results2) {

            callback(results1.lat, results1.lng, results2.lat, results2.lng);
        });
    });
}

getLatLng(loc1, loc2, function(lat1, lng1, lat2, lng2) {

});
于 2013-07-15T02:11:47.507 に答える
0

グローバル フラグ変数を使用する

例えば:

var flag_lat = var flag_lnt = 0;

postcodesearch次に、関数flag_lat=1;を追加し、flag_lng=1;それぞれ

そして各postcodesearch機能チェックの最後に

if (flag_lat && flag_lng) 
{ 
  do_the_things_function(); 
  flag_lat = flag_lng = 0; //reset the flags
}
于 2013-07-15T02:10:36.620 に答える