-2

我只是找不到这段代码有什么问题:

function getLocationName(latitude, longitude) {
    if (isNaN(parseFloat(latitude)) || isNaN(parseFloat(longitude))) {
        return false;
    }

    var locationName;
    var geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(latitude, longitude)

    // Reverse Geocoding using google maps api.
    geocoder.geocode({ 'latLng': latlng }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            if (results[1]) {
                locationName = results[1].formatted_address;
                alert(locationName);
            }
            else {
                locationName = "Unknown";
            }
        }
        else {
            locationName = "Couldn't find location. Error code: " + status;
        }
    });
    alert(locationName);
    return locationName;

}

我从这样的 jquery 事件处理程序中调用它:

$("#id").on("event", function (event, ui) {
    $("#userLocation").text(getLocationName(latitude, longitude));
});

奇怪的是,第一个警报获得了“locationName”的正确值,但第二个警报总是返回“未定义”。我尝试用一​​个值初始化变量,在这种情况下,第一个警报再次返回正确的位置名称,但第二个警报返回了初始化值。这给了我一个概念,这可能是一个与变量范围相关的问题,但我不知道是什么。

PS。我没有任何其他同名变量(本地/全局)。

更新:警报现在工作正常(感谢 Lwyrn 的回答),但返回值仍然错误。我已经按照链接的 SO 问题中的答案进行了操作,但仍然无法“返回”正确的值。警报确实工作正常。

4

1 回答 1

4

你必须移动“alert(locationName);” 进入 geocoder.geocode 回调。因为 geocoder.geocode 执行一个 AJAX 请求。当您抛出警报时,var locationName 仍然未定义(未设置)。像这样试试

function getLocationName(latitude, longitude, callback) {
    if (isNaN(parseFloat(latitude)) || isNaN(parseFloat(longitude))) {
        return false;
    }

    var locationName;
    var geocoder = new google.maps.Geocoder();
    var latlng = new google.maps.LatLng(latitude, longitude)

    // Reverse Geocoding using google maps api.
    geocoder.geocode({ 'latLng': latlng }, function (results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            if (results[1]) {
                locationName = results[1].formatted_address;
                alert(locationName);
            }
            else {
                locationName = "Unknown";
            }
        }
        else {
            locationName = "Couldn't find location. Error code: " + status;
        }
        alert(locationName);
        callback(locationName);
    });
}

要获得“回报”,您必须创建自己的回调。像这样试试

$("#id").on("event", function (event, ui) {
    getLocationName(latitude, longitude, function(result){
        $("#userLocation").text(result);
    });
});

至于alert,在ajax请求之前调用return。因此,当 ajax 请求完成他的工作时,您必须使用回调来调用!

于 2013-07-28T10:56:14.563 回答