javascript函数无法正确返回对象

时间:2016-11-09 01:08:10

标签: javascript google-maps

我没有想法。我有一个返回一个对象的javascript函数,但是控制台一直在抱怨未捕获的TypeError:无法正确读取未定义的'lat'....从控制台转储我可以看到所有内容都正确地传入函数我可以看到功能正常。问题在于回归。我不确定这个问题是什么,这看起来相当直接。旁注,我正在使用谷歌地图/地理编码API。

    function locate(val) {
        console.log(val);
        geocoder = new google.maps.Geocoder;
        geocoder.geocode({'address': val}, function(results, status) {
            if (status == 'OK') {
                var lat = results[0].geometry.location.lat();
                var lng = results[0].geometry.location.lng();
                var pos = {
                    lat: lat,
                    lng: lng
                };
                console.log('lat: ' + pos.lat);
                console.log('lng: ' + pos.lng);
                return pos;
            }
            else {
                alert('Geocode was not successful for the following reason: ' + status);
                return null;
            }
        });
    }

    for (i = 0; i < address.length; i++) {
        var coord = locate(address[i].toString());
        var lat = coord.lat;
        var lng = coord.lng
        console.log(lat);
    }

3 个答案:

答案 0 :(得分:0)

如果var lat = coord.lat循环中的for错误发生,我想是因为您在coord的回调执行之前尝试访问geocode

答案 1 :(得分:0)

这个问题是由异步引起的。

  

有关不同异步行为的更一般说明   示例,请参阅Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference

你可以这样做来解决它。

function locate(val, callback) {
    console.log(val);
    geocoder = new google.maps.Geocoder;
    geocoder.geocode({'address': val}, function(results, status) {
        if (status == 'OK') {
            var lat = results[0].geometry.location.lat();
            var lng = results[0].geometry.location.lng();
            var pos = {
                lat: lat,
                lng: lng
            };
            console.log('lat: ' + pos.lat);
            console.log('lng: ' + pos.lng);
            return pos;
        }
        else {
            alert('Geocode was not successful for the following reason: ' + status);
            return null;
        }
    });
}

function mycallcack(coord)
{
        var lat = coord.lat;
        var lng = coord.lng
        console.log(lat);
}

for (i = 0; i < address.length; i++) {
    locate(address[i].toString(), mycallback(coord));
}

答案 2 :(得分:0)

我今天遇到了类似的问题,问题是地理编码方法没有同步运行,所以有一个回调函数。回调中的return语句不会返回到locate方法的调用者。

解决方法是使用promises。如果您使用的是jQuery,那么您可以...

function locate(val) {
    console.log(val);
    var dfd = $.Deferred();
    geocoder = new google.maps.Geocoder;
    geocoder.geocode({'address': val}, function(results, status) {
        if (status === 'OK') {
            var lat = results[0].geometry.location.lat();
            var lng = results[0].geometry.location.lng();
            var pos = {
                lat: lat,
                lng: lng
            };
            console.log('lat: ' + pos.lat);
            console.log('lng: ' + pos.lng);
            dfd.resolve(pos);
        }
        else {
            dfd.reject('Geocode was not successful for the following reason: ' + status);
        }
    });
    return dfd.promise();
}

for (i = 0; i < address.length; i++) {
    locate(address[i].toString())
      .then(function(coord) {;
        var lat = coord.lat;
        var lng = coord.lng;
        console.log(lat);
      })
      .catch(function(reason) {
        console.log(reason);
      });
}

或者在ES6中:

function locate(val) {
  return new Promise((resolve,reject) => {
    geocoder = new google.maps.Geocoder;
    geocoder.geocode({'address': val}, (results, status) => {
        if (status === 'OK') {
            var lat = results[0].geometry.location.lat();
            var lng = results[0].geometry.location.lng();
            var pos = {
                lat: lat,
                lng: lng
            };
            resolve(pos);
        }
        else {
            reject('Geocode was not successful for the following reason: ' + status);
        }
    });
  }
}

for (i = 0; i < address.length; i++) {
    locate(address[i].toString())
      .then(coord => {;
        var lat = coord.lat;
        var lng = coord.lng;
        console.log(lat);
      })
      .catch(reason => {
        console.log(reason);
      });
}