Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 谷歌地图同步地理代码延迟_Javascript_Google Maps_Google Maps Api 3 - Fatal编程技术网

Javascript 谷歌地图同步地理代码延迟

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_

给你

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

问题是,initialize_map的启动速度比locate_self快,将返回的元素呈现为未定义,最后initialize_map使用默认坐标

在locate_self内部,我通过发出警报以及当前地理位置坐标创建了一个测试块,以指示此功能正常工作

问题是如何使initialize_map等待locate_self,直到它返回坐标而不是未定义的坐标

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

我以前试过使用timeout,但它仍然给我未定义的时间,也许我放置timeout块是错误的,我不知道


谢谢,如果这是一次转载,我很抱歉,为什么不换一种方式呢

显示地图 地理定位用户和设置中心
地理定位服务是异步的。解决此问题的最简单方法是使用回调,而不是使用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);