0

重複の可能性:
未定義は関数ではありません、Googleジオロケーション

場所のグーグル逆ジオコーディングを取得しようとしていますが、未定義が返されますが、console.logにアドレスが表示されます

これは値を取得する関数です

function getLatLng(latlng, callback) {
    var codedAddress;

    geocoder.geocode({'latLng': new google.maps.LatLng(40.730885,-73.997383)}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            codedAddress = results[1].formatted_address;
            console.log("codedAddress 1 = "+codedAddress);
        } else {
            alert("There was a problem with the map");
        }
        console.log("codedAddress 2 = "+codedAddress);
    });
    callback(codedAddress);
}

これが私の初期化コードです

function initialize() {
    var mapOptions = {
        zoom: 11,
        center: new google.maps.LatLng(5.386, 100.245),
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };

    map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);

    var location_coords = [
        <?php echo $output; ?>
    ];

    var location_status = [
        <?php echo $status; ?>
    ];

    var location_users = [
        <?php echo $users; ?>
    ];

    var location_date = [
        <?php echo $date; ?>
    ];

    for(i=0;i<location_coords.length;i++) {
      var traffic_options = {
        strokeColor: '#A52A2A',
        strokeOpacity: 0.8,
        strokeWeight: 1,
        fillColor: getColor(location_status[i]),
        fillOpacity: 0.5,
        map: map,
        center: location_coords[i],
        radius: 300
      };
      cityCircle = new google.maps.Circle(traffic_options);

    barr[i] = new Object;

    var marker = new google.maps.Marker({
        position: location_coords[i],
        map: map,
    });

    barr[i].marker = marker;
    barr[i].html = "<div><span style='font-size:9px'>Reported by " + location_users[i] + " on " + location_date[i] + "</span>" +
        "Traffic Location: " + getLatLng(location_coords[i], function(codedAddress) { return codedAddress; }) + 
        "<p>Traffic Condition: " + getCondition(location_status[i]) + "</p></div>";

    barr[i].infoWindow = new google.maps.InfoWindow({
        content: barr[i].html
    });

    barr[i].listener = makeClosure(i, barr[i].marker);
    }
}

問題はこの声明の中にあります

"Traffic Location: " + getLatLng(location_coords[i], function(codedAddress) { return codedAddress; })

「未定義」の代わりにここで値を取得するにはどうすればよいですか

ありがとうございました

4

2 に答える 2

0

コールバックを Google マップのコールバック関数内に移動する必要があります。

function getLatLng(latlng, callback) {
  var codedAddress;

  geocoder.geocode({'latLng': new google.maps.LatLng(40.730885,-73.997383)}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        codedAddress = results[1].formatted_address;
        console.log("codedAddress 1 = "+codedAddress);
      } else {
        alert("There was a problem with the map");
      }
      console.log("codedAddress 2 = "+codedAddress);
      callback(codedAddress); //moved here
  });
  //it was here
}

Google API が変数を設定する前にコールバックを呼び出していたためです。

編集:関数呼び出しが同期的であると想定しているため、場所を書き出すコードも変更する必要があります。

例:

getLatLng(location_coords[i], function(codedAddress) {
    barr[i].html = "<div><span style='font-size:9px'>Reported by " + location_users[i] + " on " + location_date[i] + "</span>" +
      "Traffic Location: " + codedAddress;  + 
      "<p>Traffic Condition: " + getCondition(location_status[i]) + "</p></div>";
});
于 2012-08-13T04:22:34.753 に答える
0

getLatLng() 内 (ああ、そこにある...)callback(codedAddress);ジオコード呼び出し内に移動する必要があります (そして latlng 引数を使用します):

function getLatLng(latlng, callback) {
  var codedAddress;

  geocoder.geocode({'latLng': latlng}, 
    function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        codedAddress = results[1].formatted_address;
        console.log("codedAddress 1 = "+codedAddress);
      } else {
        alert("There was a problem with the map");
      }
      console.log("codedAddress 2 = "+codedAddress);
    }

    callback(codedAddress);
  );      
}

この関数は void を返すため、コールバックはbarrオブジェクトを初期化する必要があります。

于 2012-08-13T04:28:07.393 に答える