Получение местоположения из другого файла с помощью Promise в react native с помощью react-native-geolocation-service

#javascript #react-native #promise #geolocation

#javascript #react-native #обещание #геолокация

Вопрос:

Я пытаюсь создать вспомогательную функцию для получения текущего местоположения пользователя, но результат моего обещания не определен.

Эта функция работает, и я могу получить свои координаты :

 //position.js

async function getCurrentPosition() {
  return new Promise((resolve, reject) => {
    Geolocation.getCurrentPosition(resolve, reject, {
      enableHighAccuracy: true,
      timeout: 15000,
      maximumAge: 10000,
    });
  });
}

export async function getUserLocation() {
  await request(
    // Check for permissions
    Platform.select({
      android: PERMISSIONS.ANDROID.ACCESS_COARSE_LOCATION,
      ios: PERMISSIONS.IOS.LOCATION_WHEN_IN_USE,
    }),
  ).then((res) => {
    console.log('then');
    // Permission OK
    if (res === 'granted') {
      console.log('granted');
      return getCurrentPosition();
      // Permission denied
    } else {
      console.log('Location is not enabled');
    }
  });
}
 

Но когда я вызываю свою функцию здесь, я получаю undefined :

 import {getUserLocation} from '../../utils/position';

useEffect(() => {
    getUserLocation()
      .then((res) => console.log(res)) // { undefined }
      .catch((err) => {
        console.error(err.message);
      });
  }, []);
 

Что я делаю не так?

Комментарии:

1. Попробуйте сначала использовать строки типа «Разрешено» и «Отклонено», также добавьте свою геолокацию.getCurrentPosition внутри блока try и catch

2. Я попробовал то, что вы сказали, но все еще не определено, даже если я попытаюсь передать строки вместо position.coords

3. Какую платформу вы используете? А реальное устройство или симулятор? потому что ваш код работал с моим симулятором Android и возвращал местоположение.

4. Эмулятор IOS. Но я также могу получить местоположение в функции getCurrentPosition(), но когда я вызвал ее в своем use effect (в другом файле), я не могу получить значения разрешения. Там : .then((res) => console.log(res)) // { не определено }

5. Как написано, getUserLocation() не возвращает свое request(...).then() обещание. Измените await на return .

Ответ №1:

Как написано, getUserLocation() не возвращает свой запрос(…).then() promise . Измените await на return .

Кроме того, вам действительно следует перейти console.log('Location is not enabled') на throw new Error('Location is not enabled') , что позволит вызывающей стороне getUserLocation увидеть ошибку (в случае ее возникновения).

 export async function getUserLocation() {
    return request(Platform.select({ // Check for permissions
 // ^^^^^^
        'android': PERMISSIONS.ANDROID.ACCESS_COARSE_LOCATION,
        'ios': PERMISSIONS.IOS.LOCATION_WHEN_IN_USE
    }))
    .then((res) => {
        if (res === 'granted') { // Permission OK
            return getCurrentPosition();
        } else { // Permission denied
            throw new Error('Location is not enabled'); // Throwing an Error here
                                                        // makes it available to the caller
                                                        // in its catch clause.
        }
    });
}