我开发了这一小段代码,用于获取当前的lat和lon,并将它们传递到Google Map URL以获取地图数据。
lat和lon变量最初设置为undefined,然后在调用navigator.geolocation.getCurrentPosition时更新它们的值。此函数确实通过位置对象正确返回数据。然而,不知何故,变量的值不会更新,并且在传递给URL时它们仍未定义。
问题出在哪里?
const getLocationDetails = async () => {
let lat = undefined;
let lon = undefined;
await navigator.geolocation.getCurrentPosition( position => {
lat = position.coords.latitude;
lon = position.coords.longitude;
});
const res = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${lat},${lon}`,
{ method: 'GET' });
const response = await res.json();
};
答案 0 :(得分:5)
getCurrentPosition
没有返回承诺,因此await
是一个无操作,并且该函数不会暂停等待操作getCurrentPosition
开始完成。当await
不是承诺的事情时,执行就会立即继续。
相反,给自己一个启用许可的版本:
const asyncGetCurrentPosition = options => new Promise((resolve, reject) => {
navigator.geolocation.getCurrentPosition(resolve, reject, options);
});
然后使用它:
const getLocationDetails = async () => {
let {coords: {latitude, longitude}} = await asyncGetCurrentPosition();
const res = await fetch(`https://maps.googleapis.com/maps/api/geocode/json?latlng=${latitude},${longitude}`,
{ method: 'GET' });
// Note: Missing a `res.ok` check here
const response = await res.json();
};
(let {coords: {latitude, longitude}} = ..
部分是解构分配,将coords.latitude
和coords.longitude
放入latitude
和longitude
我已经更新了fetch
以使用latitude
和longitude
[代替lat
和lon
]。也可以使用{ {1}}此处,因为您不会更改const
和latitude
。风格很重要。)