Данные извлекаются, но слишком поздно - PullRequest
0 голосов
/ 06 мая 2020
    import { Component } from "react";
    import * as firebase from "firebase";

    export class ProfileScreen extends Component {
      static navigationOptions = {
        title: "Profile",
      };
      state = {
        email: "",
        FirstName: "",
        LastName: "",
        MobileNo: "",
      };
      componentDidMount() {
        var firebaseConfig = {
          apiKey: "",
          authDomain: "",
          databaseURL: "",
          projectId: "",
          storageBucket: "",
          messagingSenderId: "",
          appId: "",
          measurementId: "",
        };
        if (!firebase.apps.length) {
          firebase.initializeApp(firebaseConfig);
        }
        let newPost;
        var id = "OEfxVtMSnLNtvmX8Sv1qgnoHwLX2";
        firebase
          .database()
          .ref("/Admin/" + id)
          .once("value", (snapshot) => {
            newPost = snapshot.val();
          });
        setTimeout(() => {
          this.setState({
            FirstName: newPost.FirstName,
            LastName: newPost.LastName,
            MobileNo: newPost.MobileNo,
          });
          if (newPost.Gender == "Male") {
            this.MchangeCol();
          } else {
            this.FchangeCol();
          }
        }, 2000);
      }
    }

Данные извлекаются, но слишком поздно, и this.setState выполняется, поскольку в переменной newPost нет данных и отображается ошибка, поэтому я использовал setTimeout в течение 10 секунд, а затем данные назначаются правильно.

Как я могу устранить этот setTimeout метод и синхронизировать c данные? Пожалуйста, помогите!

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Любой код, использующий данные из базы данных, должен находиться внутри блока then() или вызываться оттуда. Итак, самый простой способ решить вашу проблему - вызвать setState из обратного вызова then():

firebase
  .database()
  .ref("/Admin/" + id)
  .once("value", (snapshot) => {
    newPost = snapshot.val();
    this.setState({
      FirstName: newPost.FirstName,
      LastName: newPost.LastName,
      MobileNo: newPost.MobileNo,
    });
  });
0 голосов
/ 06 мая 2020

Вы можете установить значения после строки newPost=snapshot.val();. Будет работать нормально.

...