Why does getCurrentPositionAsync never returns anything?

Viewed 822

Thank you for visiting this post. I am having a trouble with React Native getting user location.

I have searched for a quite some time and read other people's posts about this function. It seems like this function has some several problems.

And also react native expo documentation seems to be outdated. https://docs.expo.dev/versions/latest/sdk/location/ I use the code from here under usage section.

import React, { useState, useEffect } from 'react';
import { Platform, Text, View, StyleSheet } from 'react-native';
import * as Location from 'expo-location';

export default function App() {
  const [location, setLocation] = useState(null);
  const [errorMsg, setErrorMsg] = useState("");

  useEffect(async () => {
    (async () => {
      let { status } = await Location.requestForegroundPermissionsAsync();
      console.log(status);
      if (status !== 'granted') {
        console.log("denied")
        setErrorMsg('Permission to access location was denied');
        return;
      }

      console.log("status", status); // <=== always says "granted"

      let location = await Location.getCurrentPositionAsync({
        accuracy: Location.Accuracy.Highest,
        maximumAge: 10000,
        timeout: 5000
      });
      console.log({ location }) // <== never reach here.
      setLocation(location);
      setErrorMsg('No ERROR');
    })();
  }, []);

  let text = 'Waiting..';
  if (errorMsg) {
    text = errorMsg;
  } else if (location) {
    text = JSON.stringify(location);
  }

  return (
    <View>
      <Text>{text}</Text>
    </View>
  );
}

I have seen one of the post saying I have to pass the arguments of accuracy, maximumAge to getCurrentPositionAsync, instead of {} empty object which is provided in the expo docs. But still does not work. since getCurrentPositionAsync is hanging, the screen keep displaying waiting....

And of course, the android emulator is setup correctly I believe, since I do see the status log and it says "granted".

Thank you in advance so much for your help and reading my post.

    "expo": "~43.0.2",
    "expo-location": "~13.0.4",
    "expo-status-bar": "~1.1.0",
    "react": "17.0.1",
    "react-dom": "17.0.1",
    "react-native": "0.64.3",
    "react-native-web": "0.17.1"
1 Answers

You can't use async with useEffect, and therefore not await.

Have you tried the other way around?

const [position, setPosition] = useState(false)
// useEffect  
  Location.getCurrentPositionAsync({
    accuracy: Location.Accuracy.Highest,
    maximumAge: 10000,
    timeout: 5000
  })
  .then(res => setPosition(res))
  .catch(e => console.log(e)

I've also had more chances without non-fat arrowed IIFE, you should try out

(function () {
      let { status } = await Location.requestForegroundPermissionsAsync();
      console.log(status);
      if (status !== 'granted') {
        console.log("denied")
        setErrorMsg('Permission to access location was denied');
        return;
      }

      console.log("status", status); // <=== always says "granted"

      let location = await Location.getCurrentPositionAsync({
        accuracy: Location.Accuracy.Highest,
        maximumAge: 10000,
        timeout: 5000
      });
      console.log({ location }) // <== never reach here.
      setLocation(location);
      setErrorMsg('No ERROR');
})();
Related