无法从react-native中的navigation.geolocation.getCurrentPosition()返回位置

时间:2019-06-09 11:38:45

标签: react-native geolocation

我正在尝试以本机拍摄图像后获取地理位置。用户捕获图像,并将图像与地理位置一起存储在一个对象中,并通过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函数时,会在将数据传输到服务器之前返回当前的地理位置。

1 个答案:

答案 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.
}