2012-12-07 140 views
0

处理我有这个简单的功能,从Mapquest服务获取GIS数据:AJAX回调返回值jQuery中

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对象不会更新,然后函数返回响应。

任何想法将有帮助谢谢!

回答

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不可知。

+0

这是一个很好的技术,虽然我添加了状态来返回true或false。现在这个函数是完美的 –

+2

@raheelshan你的代码总是返回true,因为回调被异步调用到ajax调用的'success'处理程序中。尽管如此,提供的回调不会返回任何东西,所以我没有看到这种'status' var ^^的点 – moonwave99

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

你的第二个例子并不因为AJAX请求的值工作在设置值$("#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")); 
0

你可以一个onSuccess参数添加到reverseGeocoding函数被调用当AJAX功能完成

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