谷歌地图同步地理编码延迟

时间:2014-01-30 11:30:10

标签: javascript google-maps google-maps-api-3

就是这样,jsfiddle

如您所见,我打算为谷歌地图功能制作单独的功能。 locate_self()函数用于返回当前地理位置的latlng坐标,而initialize_map()函数绘制地图并接受可选的预定义协调,否则使用默认随机坐标。

问题是,initialize_map()的触发速度比locate_self()快,将返回的元素渲染为undefined,最后,initialize_map()使用默认坐标。

locate_self()内,我通过提供alert()创建了一个测试块,以及当前的地理位置坐标,以指示此功能正常运行。

问题是我如何为locate_self()做initialize_map() 等待,直到返回坐标而不是undefined

稍后我将使用相同的解决方案来接受latlng和返回地址字符串的函数。地理编码器也有同样的“延迟”。

我之前尝试过使用超时但它仍然给我未定义(也许我错误地放置了超时块,我不知道)。

谢谢,如果这是转发,我很抱歉

2 个答案:

答案 0 :(得分:2)

为什么不反过来呢?

  1. 显示地图
  2. Geolocate用户并设置中心
  3. http://jsfiddle.net/upsidown/rMxNL/2/

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

答案 1 :(得分:2)

地理定位服务是异步的。最简单的方法是使用回调而不是return

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

Demo