【问题标题】:Google map sync geocode delay谷歌地图同步地理编码延迟
【发布时间】:2014-01-30 19:52:00
【问题描述】:

在这里,jsfiddle

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

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

locate_self() 中,我通过提供alert() 创建了一个测试块,并提供了当前的地理位置坐标,以表明此功能正常工作。

问题是我如何让 initialize_map() 等待 for locate_self() 直到它返回坐标 而不是 undefined

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

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

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

【问题讨论】:

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


    【解决方案1】:

    地理位置服务是异步的。解决这个问题的最简单方法是使用回调而不是使用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.

    【讨论】:

    • 虽然这可行,但我认为这不是一个好方法。如果用户不允许地理定位,他就根本得不到地图。
    • 公平点,但这不是问题所在。问题是“我如何让 initialize_map() 等待 locate_self() 直到它返回坐标”。
    • 谢谢大家,非常感谢您的帮助。安迪的回答最接近我的预期。虽然正如 MrUpsidown 提到的那样需要考虑,但我只需要找到另一种方法。看起来问题的根源是“如何从异步函数中获得回报”。是时候学习一下了。
    • @Andy 你是对的!我认为您的答案更接近问题,而我的答案可能更接近 通常的行为
    【解决方案2】:

    为什么不反过来呢?

    1. 显示地图
    2. 地理定位用户并设置中心

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-29
      • 2011-08-28
      • 1970-01-01
      相关资源
      最近更新 更多