我正在尝试编写一个函数来对一个zipcode进行地理编码,并将lat和lng返回给一个对象,然后返回该对象。然后我尝试将此地理编码函数的值赋给变量以创建对象。
当我控制记录在此函数中创建的对象时,我得到了一个在终端中返回的对象:
const geo = (zip) => {
geocoder.geocode(zip, function(err, data) {
let latLng = {};
latLng.lat = data.results[0].geometry.location.lat;
latLng.lng = data.results[0].geometry.location.lng;
console.log(latLng); // Returns Object As Expected
});
};
但是当我用console.log(latLng)
替换return latLng
时,在将此函数分配给变量时会得到一个未定义的值:
let newObj = geo(zip);
console.log(newObj) // Returns Undefined
我很困惑,因为最初的console.log
确实显示了地理编码功能中的对象,但是当我使用return
时,它会以undefined
的形式返回。我认为这是一个问题,我如何将它分配给变量。我毫无疑问地误解了一些事情。
答案 0 :(得分:2)
问题是你混合异步(通过回调和同步),你可以使用promises来简化这个
const geo = (zip) => {
return new Promise(resolve => {
geocoder.geocode(zip, (err, data) => {
let latLng = {};
latLng.lat = data.results[0].geometry.location.lat;
latLng.lng = data.results[0].geometry.location.lng;
resolve(latLng);
});
})
};
您可以使用该功能,如
geo(zip).then(latLng => {
console.log(latLng) // or whatever
})
答案 1 :(得分:0)
您没有指定return语句。在这种情况下避免箭头,只使用正常的功能。 .geocode()方法返回值未以任何方式分配。您需要继续将值返回给调用者。
const geo = function(zip) {
return geocoder.geocode(zip, function(err, data) {
let latLng = {};
latLng.lat = data.results[0].geometry.location.lat;
latLng.lng = data.results[0].geometry.location.lng;
console.log(latLng); // Returns Object As Expected
return latLng;
});
};
答案 2 :(得分:-1)
您可以尝试使用async-await,因为geocode方法是异步的。 参考:How to make this method asynchronous?