Ошибка с geocodeAyn c, препятствующая функции съемки - PullRequest
0 голосов
/ 11 апреля 2020

введите описание изображения здесь ] 1 rybody Я строю компонент на основе местоположения, необходимо взять название города, чтобы передать его через запрос get для API, подобного этому топору ios .get (/${cityName}/JSON);

в компоненте, который я пишу несколько раз, работает хорошо, но большую часть времени выдает эту ошибку (null не является объектом (оценивая location.coords ')] )

Как преодолеть это и как получить cityName в одиночку, используя широту и долготу или любым другим способом

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


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

 const getLocation = async () => {
    let { status } = await Location.requestPermissionsAsync();
    if (status !== 'granted') {
      setErrorMsg('Permission to access location was denied');
    }

    let location = await Location.getCurrentPositionAsync({});
    setLocation(location);
    console.log(location);
  }

  const getCity = async () => {
      const place = await Location.reverseGeocodeAsync({
          latitude : location.coords.latitude,
          longitude : location.coords.longitude
      });
      setCity(place.city);
      console.log(city);
  }

    useEffect(() => {
        getLocation() , getCity();
    } , []);



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

  return (
    <View >
        <Text> </Text>
        <Button title = 'press' 
        onPress = {getCity}
        />
    </View>
  );
}

1 Ответ

1 голос
/ 11 апреля 2020

Итак, проблема в том, что вы вызываете getCity, когда компонент впервые отображается здесь без объекта местоположения:

useEffect(() => {
    getLocation() , getCity();
} , []);

Обе функции асинхронны c, но это не гарантия того, что они будут происходить в таком порядке. Более того, происходит следующее: функции выполняются параллельно, что приводит к вашей ошибке.

У вас есть несколько вариантов здесь: - вы можете связать воедино несколько обещаний, чтобы обеспечить порядок выполнения - вы можете удалить вызов getCity из Вышеуказанный useEffect и вызывайте его только после выполнения вызова getLocation (не позволяйте пользователю взаимодействовать до этого)

...