如何在前一个函数完成其作业时才生成一个函数?

时间:2013-03-08 03:10:33

标签: javascript

我正在尝试使用某些函数来计算并显示距离其位置一定距离内的标记的距离,但是一旦页面加载就会抛出函数,因此它使用的值不正确

以下是我从数据库生成标记的功能:

<?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);
        });
    }
}

1 个答案:

答案 0 :(得分: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)
    }
}