0

我有一个从 mapquest 获取 gis 数据的简单函数:

function reverseGeocoding(lat,lng){
    var url = 'http://open.mapquestapi.com/nominatim/v1/reverse?format=json&lat=' + lat + '&lon=' +lng+' &zoom=18&addressdetails=1';
    $.ajax({
        url: url,                       
        crossDomain:true,
        success: function(response){                
            $("#revgeo-place").html(response.display_name);                 
        }
    });

}

我该如何改进它,以便当从另一个函数调用此函数时,返回值会异步更新?

我不想在函数中显式地放置任何 DOM 引用,并且我想保持 ajax 异步,理想情况下应该是这样的:

$("#revgeo-place").html(reverseGeocoding(lat,lng).display_name);

function reverseGeocoding(lat,lng){
    var url = 'http://open.mapquestapi.com/nominatim/v1/reverse?format=json&lat=' + lat + '&lon=' +lng+' &zoom=18&addressdetails=1';
    $.ajax({
        url: url,                       
        crossDomain:true,
        success: function(response){
            console.log(response);
            return response;                                    
        }
    });

}

看起来当我这样做时 DOM 对象没有更新,然后函数返回响应。

任何想法都会有所帮助,谢谢!

4

4 回答 4

5

您可以使用回调:

function reverseGeocoding(lat,lng, callback){
    var url = 'http://open.mapquestapi.com/nominatim/v1/reverse?format=json&lat=' + lat + '&lon=' +lng+' &zoom=18&addressdetails=1';
    $.ajax({
        url: url,                       
        crossDomain: true,
        success: callback
    });
};

reverseGeocoding(lat,lng, function(response){

    $("#revgeo-place").html(response.display_name);

});

所以你的reverseGeocoding函数对 DOM 是不可知的。

于 2012-12-07T12:20:02.950 回答
3

从 ajax 调用返回延迟对象,并done()在 ajax 调用完成时使用该函数更新 HTML:

reverseGeocoding(lat,lng).done(function(data) {
    $("#revgeo-place").html(data.display_name);
});

function reverseGeocoding(lat,lng){
    var url = 'http://open.mapquestapi.com/nominatim/v1/reverse?format=json&lat=' + lat + '&lon=' +lng+' &zoom=18&addressdetails=1';
    return $.ajax({
        url: url,                       
        crossDomain:true
    });
}
于 2012-12-07T12:17:34.447 回答
0

您的第二个示例不起作用,因为在您设置$("#revgeo-place").html().

如果您希望能够修改更新的元素,请将其作为参数添加到您的函数中,如下所示:

function reverseGeocoding(lat, lng, $updateElement){
    var url = 'http://open.mapquestapi.com/nominatim/v1/reverse?format=json&lat=' + lat + '&lon=' +lng+' &zoom=18&addressdetails=1';
    $.ajax({
        url: url,                       
        crossDomain:true,
        success: function(response){                
            $updateElement.html(response.display_name);                 
        }
    });
}

reverseGeocoding(latitude, longitude, $("#revgeo-place"));
于 2012-12-07T12:19:08.190 回答
0

您可以将onSuccess参数添加到reverseGeocodingajax 函数完成时调用的函数

function reverseGeocoding(lat, lng, onSuccess){
    var url = 'http://open.mapquestapi.com/nominatim/v1/reverse?format=json&lat=' + lat + '&lon=' +lng+' &zoom=18&addressdetails=1';
    $.ajax({
        url: url,                       
        crossDomain:true,
        success: function(response){
            onSuccess();                                 
        }
    });
}

function onReverseGeocodingSuccess() {
    $("#revgeo-place").html(response.display_name); 
}

reverseGeocoding(100, 200, onReverseGeocodingSuccess);
于 2012-12-07T12:19:52.090 回答