Javascript 为什么我的地理编码函数返回未定义?
我用谷歌地理编码API对我的地址进行地理编码,从“地址150,城市”到它的纬度和经度。在函数的末尾,我试图返回一个对象,其中包含这两个对象,如下面的代码所示 我认为问题可能是,编码需要相当长的时间,因为我今天想解决这个问题,而且我还没有学会等待和异步承诺之类的东西(我明天会做,别担心),所以我改用了setTimeout,但即使我在编码完成后调用console.log,它也没有解决问题。因为我是JS新手,所以我试着将它包装成变量,只是稍微处理一下代码,但都没用Javascript 为什么我的地理编码函数返回未定义?,javascript,function,return,Javascript,Function,Return,我用谷歌地理编码API对我的地址进行地理编码,从“地址150,城市”到它的纬度和经度。在函数的末尾,我试图返回一个对象,其中包含这两个对象,如下面的代码所示 我认为问题可能是,编码需要相当长的时间,因为我今天想解决这个问题,而且我还没有学会等待和异步承诺之类的东西(我明天会做,别担心),所以我改用了setTimeout,但即使我在编码完成后调用console.log,它也没有解决问题。因为我是JS新手,所以我试着将它包装成变量,只是稍微处理一下代码,但都没用 // add
// address
var address = "Address 156, City"
function geocode(address) {
axios.get("https://maps.googleapis.com/maps/api/geocode/json", {
params: {
address: address,
key: "AIzaSyDaXOpbCeLYeRxWXtuSQQEbQzR14PejczM"
}
})
.then((response) => {
let lngLat = {
lat: response.data.results[0].geometry.location.lat,
lng: response.data.results[0].geometry.location.lng}
console.log(lngLat) // here it shows me my object
return lngLat;
})
}
let geocodedAddress = geocode(address);
setTimeout(function () { console.log(geocodedAddress); }, 3000);
}
});
您的函数中没有
return
。then()
中的返回不返回到外部函数
此外,请求是异步的,因此您需要返回axios.get
promise,并在调用函数时使用另一个then()
来访问数据
function geocode(address) {
// return the promise
return axios.get("https://maps.googleapis.com/maps/api/geocode/json", {
params: {
address: address,
key: "AIzaSyDaXOpbCeLYeRxWXtuSQQEbQzR14PejczM"
}
})
.then((response) => {
let lngLat = {
lat: response.data.results[0].geometry.location.lat,
lng: response.data.results[0].geometry.location.lng
};
return lngLat;
});
}
// usage
geocode(address).then(lngLat => {
console.log(lngLat);
});
我无法访问您的全部代码,但解决您的问题的异步/等待方法是:
// address
var address = "Address 156, City"
async function geocode(address) {
const response = await axios.get("https://maps.googleapis.com/maps/api/geocode/json", {
params: {
address: address,
key: "AIzaSyDaXOpbCeLYeRxWXtuSQQEbQzR14PejczM"
}
})
let lngLat = {
lat: response.data.results[0].geometry.location.lat,
lng: response.data.results[0].geometry.location.lng
}
console.log(lngLat) // here it shows me my object
return lngLat;
}
let geocodedAddress = await geocode(address);
console.log(geocodedAddress);
}
});
请注意async/await如何允许您编写简单的顺序逻辑来执行异步操作。只需在调用“return lngLat;”的地方执行实际工作即可“承诺不会返回那样的价值观。”埃文斯·诺尔斯有时我倾向于过于复杂化。感谢您解决我的问题:)需要另一个异步函数来执行let geocodedAddress=wait geocode(address)
这是真的,但我假设没有理由其他函数也不能是异步的。