Код Firestore не ждет ответа - PullRequest
0 голосов
/ 08 марта 2020

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

Вот код контроллера:

  _signIn = async () => {
    try {
      // Google sign in and connect to Firebase
         ... This code is working as expected
      // Connect to the Firebase Firestore and store the connection
        CesarFirestore.setFirestore(firebase.firestore());
        let cFS = CesarFirestore.getInstance();
        cFS.saveLoginDetails(this.cUser);
     // THIS IS THE CALL TO GET THE STATUS OF THE USER
        await cFS.readAvailability(this.cUser);
        this.setState({loggedIn: true});
      } else {
        ... INVALID login coding works fine 
      }
    } catch (error) {
      ... CATCH coding works fine
      }
    }
  };

Из отмеченной выше строки выполняется следующий код:

  async readAvailability(cUser) {
    let tuesdayDate = new CesarDate().getTuesday();
    let availableRef = CesarFirestore.getFirestore().collection('available');
    let availableQuery = await availableRef
      .where('tuesdayDate', '==', tuesdayDate)
      .where('userId', '==', cUser.getUserId())
      .get()
      .then(snapshot => {
        if (snapshot.empty) {
          console.log('No matching documents.');
          cUser.setTuesdayAvailability('NOT_FOUND');
        }
        snapshot.forEach(doc => {
          cUser.setTuesdayAvailability(doc.get('status'));
        });
      })
      .catch(err => {
        console.log('Error getting documents', err);
      });
  }

Поэтому код readAvailability (cUser) должен дождаться, пока availableQuery вернет результаты. Затем результаты будут сохранены в классе cUser, который доступен для остальной части приложения.

В некоторых случаях бывает, что результат доступен, а иногда - нулевой. Я думаю, это потому, что doc не определено, что я подтвердил с помощью отладчика.

Любая помощь будет большой, и спасибо заранее

1 Ответ

1 голос
/ 08 марта 2020

Если вы await для функции, она должна вернуть значение или обещание, которое разрешается в значение позже. Поскольку вместо этого вы используете обещание (в вашем обработчике then()), у переводчика нет возможности узнать, чего ожидать.

  async readAvailability(cUser) {
    let tuesdayDate = new CesarDate().getTuesday();
    let availableRef = CesarFirestore.getFirestore().collection('available');
    let snapshot = await availableRef
      .where('tuesdayDate', '==', tuesdayDate)
      .where('userId', '==', cUser.getUserId())
      .get()
    if (snapshot.empty) {
      console.log('No matching documents.');
      cUser.setTuesdayAvailability('NOT_FOUND');
    }
    snapshot.forEach(doc => {
      cUser.setTuesdayAvailability(doc.get('status'));
    });
    return true; 
  }

Я бы обычно делал возврат readAvailability пользователь его изменил, но выше тоже должно работать.

...