JavaScript - 来自国家/地区名称的 Google API lat/lng

标签 javascript json ajax google-maps google-maps-api-3

我想知道为什么这不起作用,它完美地记录 Object {lat: 52.132633, lng: 5.291265999999999} 。但只有console.log()里面done()功能有效。当我返回那个确切的变量时,对另一个不起作用...

function getLatLng() {
    var LatLng;
    $.ajax({
        url: 'https://maps.googleapis.com/maps/api/geocode/json?address=germany&sensor=false',
        type: 'GET',
        dataType: 'json',
    })
    .done(function(data) {
        LatLng = data.results[0];
        console.log(LatLng);
    })
    return LatLng;
}

console.log(getLatLng());

我需要一些解决方法,以便我可以制作 initMap()函数与我的纬度和经度变量一起使用:

function getLatLng() {
    var LatLng;
    $.ajax({
        url: 'https://maps.googleapis.com/maps/api/geocode/json?address=germany&sensor=false',
        type: 'GET',
        dataType: 'json',
    })
    .done(function(data) {
        LatLng = data.results[0];
        console.log(LatLng);
    })
    return LatLng;
}

console.log(getLatLng()); // undefined

  function initMap() {

    var styledMapType = new google.maps.StyledMapType(
        [],
        {name: 'Styled Map'});

    var map = new google.maps.Map(document.getElementById('map'), {
      center: {lat: latVal, lng: lngVal}, // error >>> undefined
      zoom: 11,
      mapTypeControlOptions: {
        mapTypeIds: ['roadmap', 'satellite', 'hybrid', 'terrain',
                'styled_map']
      }
    });

    map.mapTypes.set('styled_map', styledMapType);
    map.setMapTypeId('styled_map');
  }

最佳答案

这是因为对 google api 的调用是异步的。 这意味着外部控制台日志已执行,而来自 google 的响应仍处于待处理状态。

你可以这样写:

function getLatLng() {
    return $.ajax({
        url: 'https://maps.googleapis.com/maps/api/geocode/json?address=germany&sensor=false',
        type: 'GET',
        dataType: 'json',
    });
}

getLatLng().done(function(data) {
    var latlng = data.results[0];
    console.log(latlng);
    //...further processing
});

如果您需要在done函数之外访问latlng,您可以重写如下:

function getLatLngPromise() {
    return new Promise(function(resolve) { 
        $.ajax({
            url: 'https://maps.googleapis.com/maps/api/geocode/json?address=germany&sensor=false',
            type: 'GET',
            dataType: 'json',
        }).done(function(data) {
            resolve(data);
        });
    });
}

async function getLatLng() {
    var data = await getLatLngPromise();
    return data[0];
}

var latlng = getLatLng();
console.log(latlng);

或者您可以使用 latlng 参数对 initMap 进行参数化,并将 initMap 调用移至我的第一个示例的 did 函数。 ( pastebin.com/VpSUma9R )

关于JavaScript - 来自国家/地区名称的 Google API lat/lng,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44970093/

相关文章:

ajax - 从 Magento Admin Extension 输出 ajax 数据的最佳方式

javascript - PhantomJS/SlimerJS 无法通过 document.querySelector() 找到元素

javascript - 服务器和客户端类名不匹配

javascript - Webkit 错误在居中的绝对 div 中渲染图像

javascript - AJAX-Post 之后文件未下载

asp.net - web api方法返回json格式的数据?

javascript - 将 jQuery (ajax) 与 TypeScript 结合使用

javascript - 如何显示从 json 到 html 的超链接

json - 在 Spray 1.2.0 路由中将查询字符串参数与 JSON 实体相结合

javascript - 检索当前用户的策略