Javascript-can console.log函数中的一个对象,但当返回时,它返回为未定义
我试图编写一个函数来对zipcode进行地理编码,并将lat和lng返回到一个对象,然后返回这个对象。然后,我尝试将这个地理编码函数的值赋给一个变量,以创建一个对象 当我将在该函数中创建的对象记录到控制台日志中时,我在终端中得到了一个预期返回的对象: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
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
来使用该函数,这非常有效。谢谢你的解释,这对我帮助很大。