Javascript - 可以在一个函数内部控制一个对象,但是在返回时它会以未定义的形式返回

时间:2018-02-28 05:11:17

标签: javascript ecmascript-6

我正在尝试编写一个函数来对一个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的形式返回。我认为这是一个问题,我如何将它分配给变量。我毫无疑问地误解了一些事情。

3 个答案:

答案 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?