首页 文章

RN与Firestore无法等待Promise解决

提问于
浏览
0

我有一个简单的调用Firestore来编写一个doc然后在更改父级状态之前等待doc完成写入 . 但是,父状态变化太快,导致读取我认为尚未编写/传播的字段 . 我尝试使用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 回答

  • 1

    我不确定你到底遇到的问题,主要是因为你只显示了这个功能,而不是你在应用程序的其余部分中使用它的方式 . 但我可以肯定地告诉你三件事:

    • 当set()的promise成功解析时,您可以确定文档是否已写入 .

    • get()set() 是异步的, then() 也是如此 . 他们都返回承诺代表异步工作 .

    • 第2项表示整个函数updateDBEntry()也是异步的,并在任何工作完成之前立即返回 .

    因为整个函数是异步的,所以当它返回时,文档还没有被创建 . 相反,也许这个函数应该在所有工作完成后才返回解析,这样调用者也可以使用它设置一些代码在工作完成后执行 .

相关问题