RN с Firestore не может дождаться разрешения Promise - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть простой вызов в Firestore, чтобы написать документ, а затем подождать, пока документ завершит запись, прежде чем менять состояние родителя.Тем не менее, родительское состояние изменяется слишком быстро, в результате чего поля чтения, которые, я думаю, еще не были записаны / распространены.Я попытался добавить задержку с помощью setTimeout, и она, кажется, игнорируется.Как я могу убедиться, что изменение состояния вызывается только после полной записи документа Firestore?

Код:

updateDBEntry(stateObj) {
   var that = this;
   var docRef = firebase.firestore().collection('sessions').doc(this.state.userID);
   docRef.get().then((doc) => {
     if (!doc.exists) {
       const timestamp = firebase.firestore.FieldValue.serverTimestamp();
       var duration = (stateObj.seshDuration) ? stateObj.seshDuration : 1;
       docRef.set({
         seshName: stateObj.seshName,
         seshStreet: stateObj.seshStreet,
         seshZipcode: stateObj.seshZipcode,
         seshDuration: duration,
         seshDesc: stateObj.seshDesc,
         seshTime: timestamp,
       }).then(() => {
         var handleToUpdate  = that.props.handleToUpdate;
         setTimeout(() => {
            handleToUpdate(1); //this changes the parent's state
          }, 10000);
       });
     }
  });

 }

1 Ответ

0 голосов
/ 09 декабря 2018

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

  1. Когда обещание от set () разрешится успешно, вы можете быть уверены, что документ написан.
  2. get() и set() асинхронны, как и then().Все они возвращают обещания, представляющие асинхронную работу.
  3. Элемент 2 означает, что вся ваша функция updateDBEntry () также является асинхронной и возвращается немедленно, прежде чем любая из работ завершена.

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

...