Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/456.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-can console.log函数中的一个对象,但当返回时,它返回为未定义_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript-can console.log函数中的一个对象,但当返回时,它返回为未定义

Javascript-can console.log函数中的一个对象,但当返回时,它返回为未定义,javascript,ecmascript-6,Javascript,Ecmascript 6,我试图编写一个函数来对zipcode进行地理编码,并将lat和lng返回到一个对象,然后返回这个对象。然后,我尝试将这个地理编码函数的值赋给一个变量,以创建一个对象 当我将在该函数中创建的对象记录到控制台日志中时,我在终端中得到了一个预期返回的对象: const geo = (zip) => { geocoder.geocode(zip, function(err, data) { let latLng = {}; l

我试图编写一个函数来对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
时,它返回为
未定义的
。我认为这是一个如何将其分配给变量的问题。毫无疑问,我误解了一些事情

您没有指定返回语句。在这种情况下,避免使用箭头,只需使用正常功能。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;
        });       

};

问题是您混合了异步(通过回调和同步),您可以使用承诺来简化这一过程

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
})

您可以尝试async Wait,因为地理编码方法是异步的。
参考资料:

这不会有任何区别。你只是给
geocode
回调添加了一个返回值,它没有分配到任何地方。我意识到了这一点。编辑@Phila假设是Google的geocoder,
geocode
不会返回任何信息~那么他必须尝试使用全局变量才能访问值还有比这更好的选项。查看什么是
geocoder
geocode
返回什么(如果有的话)?您的对象letlang是使用let声明的,所以当您移出回调函数时,letlang将超出范围(块级范围),您将无法定义。所以把它的作用域移出回调函数。@HimanshuShekhar这是一个可怕的错误idea@Phil我的想法有多糟糕?请引导我。:)@HimanshuShekhar,这将把latLng从回调函数的作用域中移除,然后latLng将只是一个空对象。我不会忽略
err
。为什么不添加
if(err)return reject(err)
?@Phil我也不会忽略,
err
,我只是向他展示了如何完成它(更多的是一个伪代码),而不是一个完整的代码solution@maison.m正如@Phil所建议的,你必须通过拒绝承诺来处理
err
,理想情况下,您也可以使用
wait
来使用该函数,这非常有效。谢谢你的解释,这对我帮助很大。