Почему первый SetState всегда влияет, а второй не реагирует на родной? - PullRequest
0 голосов
/ 24 апреля 2019

Я использую setState внутри componentDidMount (), чтобы установить состояние тех же переменных, но я понимаю, что первый setState всегда затронут, и переменные принимают значения, определенные в первом setState.Я хочу, чтобы второй перезаписал первый и дал переменным значения второго setState.Даже если я изменю порядок того же результата.Почему это происходит?Если быть точным, я говорю о переменных широты и долготы.

  componentDidMount() {

    fetch('myUrl')
      .then((response) => response.json())
      .then((responseJson) => {
        Geocoder.setApiKey('myUrl');
        Geocoder.getFromLocation(responseJson.comune_nascita).then(
          json => {
            var location = json.results[0].geometry.location;
            this.setState({
              Load:false,
              latitude:location.lat,
              longitude:location.lng
            })

          },

            error => {
              alert(error);
            }
          );
      })

      .catch((error) => {
        console.log(error)
      });


        navigator.geolocation.getCurrentPosition(position => {
        this.setState({
          latitude: position.coords.latitude,
          longitude: position.coords.longitude,
          error: null,
        });
      },
        error => this.setState({ error: error.message }),
        { enableHighAccurancy: false, timeout: 2000, maximumage: 2000 }
      );
   }

1 Ответ

0 голосов
/ 24 апреля 2019

Ваш вопрос, по-видимому, указывает на то, что «первый setState» - это setState, вызываемый в запросе на выборку, а «второй setState» - это setState, вызываемый в методе getCurrentPosition в навигаторе. В соответствии с этим у меня есть некоторые ответы и предложения.

Это проблема с вашим кодом, являющимся асинхронным . Как вы можете видеть, вызывается выборка, а затем после ее завершения устанавливает состояние независимо от широты и долготы. Второй вызов не является асинхронным вызовом, он вызывается, как только вызывается componentDidMount.

По сути, второй вызов setState фактически вызывается первым, как только компонент монтируется, и ТОЛЬКО первый setState перезаписывает его после завершения выборки.

Чтобы исправить это, я бы предложил перестроить вашу методологию работы этой функции. Асинхронный вызов всегда будет заканчиваться вторым, и поэтому вы можете изменить значения по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...