Javascript sucess函数中的AJAX回调

Javascript sucess函数中的AJAX回调,javascript,jquery,ajax,return,Javascript,Jquery,Ajax,Return,我试图使用来自AJAX的回调从lat/long返回一个City,但是返回是未定义的,尽管AJAX使用正确的值(City)调用回调 我一直在阅读,但我试图弄明白为什么这个城市仍然被归还,并被写为未定义 以下是全部代码: function getLocation(id) { x = document.getElementById(id); if (navigator.geolocation) { navigator.geolocation.getCurrentPosi

我试图使用来自AJAX的回调从lat/long返回一个City,但是返回是未定义的,尽管AJAX使用正确的值(City)调用回调

我一直在阅读,但我试图弄明白为什么这个城市仍然被归还,并被写为未定义

以下是全部代码:

function getLocation(id) {
    x = document.getElementById(id);
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function showPosition(position) {
            x.innerText = GetCity(position.coords.latitude, position.coords.longitude, returnCity);
        });
    } else {
        this.innerHTML = "Geolocation is not supported by this browser.";
    }
}

function returnCity(result) {
    return result;
}

function GetCity(lat, long, callback) {
    $.ajax({
        type: "GET",
        dataType: "json",
        url: "http://maps.googleapis.com/maps/api/geocode/json?latlng=" + lat + "," + long + "&sensor=false",
        data: {},
        success: function (data) {
            var city;
            $.each(data['results'], function (i, val) {
                $.each(val['address_components'], function (i, val) {
                    if (val['types'] == "locality,political") {
                        if (val['long_name'] != "") {
                            city = val['long_name'];
                        } else {
                            city = "N/A";
                        }
                    }
                });
            });
            callback(city);
        },
        error: function () {
            alert('error');
        }
    });
}

GetCity
不返回值,这就是为什么它总是返回为
undefined
。异步编程需要时间来掌握技巧,但通常不使用函数的返回,而是传递回调。您要做的一件棘手的事情是,您需要将元素保持在适当的范围内,以便可以在回调中设置内部文本。下面的代码给出了一个使用匿名函数而不是命名函数回调的示例

function getLocation(id) {
    x = document.getElementById(id);
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function showPosition(position) {
            GetCity(position.coords.latitude, position.coords.longitude, function(result) {
                x.innerText = result;
            });
        });
    } else {
        this.innerHTML = "Geolocation not supported by browser.";
    }
}

function GetCity(lat, long, callback) {
    $.ajax({
        type: "GET",
        dataType: "json",
        url: "http://maps.googleapis.com/maps/api/geocode/json?latlng=" + lat + "," + long + "&sensor=false",
        data: {},
        success: function (data) {
            var city;
            $.each(data['results'], function (i, val) {
                $.each(val['address_components'], function (i, val) {
                    if (val['types'] == "locality,political") {
                        if (val['long_name'] != "") {
                            city = val['long_name'];
                        }
                        else {
                            city = "N/A";
                        }
                    }
                });
            });
            callback(city);
        },
        error: function () { alert('error'); }
    });
}

GetCity
不返回值,这就是为什么它总是返回为
undefined
。异步编程需要时间来掌握技巧,但通常不使用函数的返回,而是传递回调。您要做的一件棘手的事情是,您需要将元素保持在适当的范围内,以便可以在回调中设置内部文本。下面的代码给出了一个使用匿名函数而不是命名函数回调的示例

function getLocation(id) {
    x = document.getElementById(id);
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(function showPosition(position) {
            GetCity(position.coords.latitude, position.coords.longitude, function(result) {
                x.innerText = result;
            });
        });
    } else {
        this.innerHTML = "Geolocation not supported by browser.";
    }
}

function GetCity(lat, long, callback) {
    $.ajax({
        type: "GET",
        dataType: "json",
        url: "http://maps.googleapis.com/maps/api/geocode/json?latlng=" + lat + "," + long + "&sensor=false",
        data: {},
        success: function (data) {
            var city;
            $.each(data['results'], function (i, val) {
                $.each(val['address_components'], function (i, val) {
                    if (val['types'] == "locality,political") {
                        if (val['long_name'] != "") {
                            city = val['long_name'];
                        }
                        else {
                            city = "N/A";
                        }
                    }
                });
            });
            callback(city);
        },
        error: function () { alert('error'); }
    });
}

我已经编辑了很多,所以请确保您获得最新的;)使用编辑过的答案,您可能希望删除GetCity()上的“id”参数?看起来不错,我已经编辑了不少,所以请确保您获得最新的;)使用编辑过的答案,您可能希望删除GetCity()上的“id”参数?看起来不错