我想要的是使用Leaflet maps +功能,在那里我可以传递纬度/经度并接收带有地址的短信。
我正在尝试使用esri插件,但是我做错了事。 目前,我很想获得函数的inseide,但是我不知道如何正确地将其传递给变量。
这是我的代码:
var map = L.map('map').setView([40.725, -73.985], 7);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
attribution: '© <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'
}).addTo(map);
var geocodeService = L.esri.Geocoding.geocodeService();
map.on('click', function(e) {
geocodeService.reverse().latlng(e.latlng).run(function(error, result) {
L.marker(result.latlng).addTo(map).bindPopup(result.address.Match_addr).openPopup();
});
});
var message;
message = geocodeService.reverse().latlng([40.725, -73.985]).run(function(error, result) {
//alert(result.address.Match_addr); //this alert works here ok and can retur addrress
return result.address.Match_addr;
});
//this alert won't work, why I can get the address here outside the function
alert(message);
这是完整的示例: https://jsfiddle.net/5aq6z1vL/
如何使用地址解析器之类的功能:
var address = convertToAddress([40.725, -73.985]);
function convertToAddress(]lat,lon])
{
// here return address after geocoding
}
答案 0 :(得分:0)
之所以会这样,是因为message
将充满来自run
函数的HTTP响应。
由于run
函数需要一些时间来执行,因此alert(message)
将在运行函数完成之前被执行。
以下是可以解决您问题的方法的小提琴:JSFiddle
编辑:
好的,所以您要寻找的是Promises
。
您的代码需要等待插件获取地址。
不幸的是,我不知道如何使用香草JS做到这一点,所以我导入了jQuery(以使用方法$.when
和then
和对象$.Deferred
)。
这是新的Fiddle
如果您在香草JS中需要此功能,我可以研究香草JS中的Promises。
答案 1 :(得分:0)
您可以通过以下方式更改功能:
var geocodeService = L.esri.Geocoding.geocodeService();
geocodeService.reverse().latlng([36.2933693, 7.9388789]).run(function (error, result) {
if (error) {
return;
}
L.marker(result.latlng).addTo(map).bindPopup(result.address.Match_addr).openPopup();
});