我正在尝试以本机拍摄图像后获取地理位置。用户捕获图像,并将图像与地理位置一起存储在一个对象中,并通过http请求发送到服务器。
保存获取地理位置的功能正常,但我无法返回要存储在对象中的地理位置以进行HTTP传输。我得到一个不确定的信息。
console.log('getCoordinates run')
await navigator.geolocation.getCurrentPosition(
position => {
let coordinates = `${position.coords.longitude},
${position.coords.latitude}`
return coordinates
},
error => Alert.alert(error.message),
{ enableHighAccuracy: false, timeout: 20000, maximumAge: 1000 }
)
}
captureImage = async () => {
if (this.camera) {
const options = { quality: 0.5, base64: true };
const data = await this.camera.takePictureAsync(options);
console.log(data);
let postData = {
user: 1,
coordinates: this.getCoordinates(),
image: `data:image/jpeg;base64${data.base64}`,
}
console.log(postData)
axios.post('https://localhost:5000/api/posts', postData)
.then(post => res.json(post))
.catch(err => console.log(err))
}
}
预期的结果是,当captureImage函数与postData对象一起运行getCoordinates函数时,会在将数据传输到服务器之前返回当前的地理位置。
答案 0 :(得分:1)
geolocation.getCurrentPosition
函数在这里的工作方式是:它设置了获取用户位置后发送数据的回调。获取和发送相关数据需要时间。这就是为什么我们使用回调或Promise。但是在代码中,您只需调用函数,而无需等待其响应,只需执行API调用即可。
我假设您已使用Async函数来执行此操作。但是,如果我是您,我将尝试在此处使用Promises解决此问题。一个简单的例子就是
captureImage = async () => {
if (this.camera) {
// ... do your camera tasks
}
this.sendImageData(data); // data is what you got from camera.
}
getGeoInfo = () => {
return new Promise((resolve, reject) => {
navigator.geolocation.getCurrentPosition(
position => {
let coordinates = `${position.coords.longitude},
${position.coords.latitude}`
resolve(coordinates);
},
error => reject(error),
{ enableHighAccuracy: false, timeout: 20000, maximumAge: 1000 }
)
})
}
sendImageData = (cameraData) => {
let coordinates = '';
getGeoInfo.then(crdnts => coordinates = crdnts );
// now coordinates have all relevant data you wished.
const data = { //... make the object as you want }
// do the API call using axios as you've already done.
}