0

いくつかの関数を使用して、マーカーの位置から特定の距離内にあるマーカーのみの距離を計算して表示しようとしていますが、ページが読み込まれるとすぐに関数がキャストされるため、誤った値が使用されています

データベースからマーカーを生成するための関数は次のとおりです。

<?php while($stmt -> fetch()) { ?>
var longi = "<?php echo $gLongitude; ?>";
var lati = "<?php echo $gLatitude; ?>";
var title = "<?php echo $gTitle; ?>";
createMarker(lati, longi, title);
<?php } $stmt -> close(); $mysqli -> close();?>

次に createMarker を呼び出します

function createMarker(lati, longi, title) {
    var latLongMarker = new google.maps.LatLng(lati, longi);
    marker = new google.maps.Marker({
        position: latLongMarker,
        map: map,
        title: title
    });
    arrMarker.push(marker);
    marker.setMap(null);
    setMarker(latLongMarker);
}

次に setmarker を呼び出します

function setMarker(position) {
    console.log(arrMarker.value);
    for (var i = 0; i < arrMarker.length; i++) {
        var latLong = arrMarker[i].getPosition();
        distance = google.maps.geometry.spherical.computeDistanceBetween(latLong, position);
        if (distance < 4000) {
            addMarker(arrMarker[i].getPosition());
        }
    }
}

問題は、以下を使用して地理位置情報が設定される前に呼び出され続けることです。

function locateMe() {
if (navigator.geolocation) {
    browserSupportFlag = true;
    navigator.geolocation.getCurrentPosition(function(position) {
            initialLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
            map.setCenter(initialLocation);
            map.setZoom(15);
            setMarkerPosition(position.coords.latitude,position.coords.longitude);
        }, function() {
            handleNoGeolocation(browserSupportFlag);
        });
    }
}
4

1 に答える 1

2

位置を取得した後にコードを実行する場合は、そのコードを getCurrentPosition コールバック内に配置する必要があります。

navigator.geolocation.getCurrentPosition(function(position) {
    initialLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
    map.setCenter(initialLocation);
    map.setZoom(15);
    setMarkerPosition(position.coords.latitude,position.coords.longitude);

    createMarker() // <---
}, function() {
    handleNoGeolocation(browserSupportFlag);
});

残念ながら、「非同期」コードを、完了時に戻る通常の関数に変換する方法はありません。あなたができる最善のことは、次の関数を呼び出す部分をパラメーターにすることです。

function locateMe(callback){
    googleMapsStuff(function(position){
       //things...
       callback(value_you_would_have_returned)
    }
}
于 2013-03-08T03:17:37.770 に答える