Javascript 谷歌地图同步地理代码延迟
给你 正如您所看到的,我打算为谷歌地图功能创建单独的功能。locate_self函数用于返回当前地理位置的latlng坐标,而initialize_map函数绘制地图并接受可选的预定义坐标。否则,使用默认的随机坐标 问题是,initialize_map的启动速度比locate_self快,将返回的元素呈现为未定义,最后initialize_map使用默认坐标 在locate_self内部,我通过发出警报以及当前地理位置坐标创建了一个测试块,以指示此功能正常工作 问题是如何使initialize_map等待locate_self,直到它返回坐标而不是未定义的坐标 稍后我将对接受latlng和返回地址字符串的函数使用相同的解决方案。地理编码器也有同样的“延迟” 我以前试过使用timeout,但它仍然给我未定义的时间,也许我放置timeout块是错误的,我不知道Javascript 谷歌地图同步地理代码延迟,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,给你 正如您所看到的,我打算为谷歌地图功能创建单独的功能。locate_self函数用于返回当前地理位置的latlng坐标,而initialize_map函数绘制地图并接受可选的预定义坐标。否则,使用默认的随机坐标 问题是,initialize_map的启动速度比locate_self快,将返回的元素呈现为未定义,最后initialize_map使用默认坐标 在locate_self内部,我通过发出警报以及当前地理位置坐标创建了一个测试块,以指示此功能正常工作 问题是如何使initialize_
谢谢,如果这是一次转载,我很抱歉,为什么不换一种方式呢 显示地图 地理定位用户和设置中心
地理定位服务是异步的。解决此问题的最简单方法是使用回调,而不是使用return:
.虽然这很有效,但我认为这不是一个好方法。如果一个用户不允许地理定位,他就根本得不到地图。说得好,但这不是问题所在。问题是如何让初始化映射等待定位self,直到它返回坐标。谢谢各位,我真的很感谢你们的帮助。安迪的回答最接近我的预期。虽然有提到MRP的事情,但我只需要找到另一种方法。问题的根源似乎是如何从异步函数获取返回。是时候学习了。@Andy你说得对!我认为你的答案更接近问题,而我的答案可能更接近通常的行为。
var gm_map_container = document.getElementById('container');
var gm_map_options = { zoom: 8 };
function initialize_map(location) {
gm_map = new google.maps.Map(gm_map_container,gm_map_options);
if (!location) { location = new google.maps.LatLng(-34.397, 150.644); }
gm_map.setCenter(location);
locate_self();
}
function locate_self() {
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
var pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
gm_map.setCenter(pos);
});
} else { return false; }
}
initialize_map();
function initialize_map(result) {
if (result !== 'error') {
gm_map = new google.maps.Map(gm_map_container, gm_map_options);
if (!result) {
result = new google.maps.LatLng(-34.397, 150.644);
}
gm_map.setCenter(result);
}
}
function locate_self(callback) {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function (position) {
var pos = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
callback(pos);
});
} else { callback('error'); }
}
locate_self(initialize_map);