-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」の正しい値を取得するのに、2 番目のアラートが常に「undefined」を返すことです。変数を値で初期化しようとしましたが、その場合、最初のアラートは正しい場所の名前を返しましたが、2 番目のアラートは初期化値を返しました。これは、これが変数スコープに関連する問題である可能性があるという考えを私に与えますが、私は何を理解することはできません.

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

アラートに関しては、リターンは ajax リクエストの前に呼び出されます。そのため、ajax リクエストが仕事を終えたときに呼び出されるコールバックを使用する必要があります。

于 2013-07-28T10:56:14.563 に答える