【问题标题】:RN with Firestore unable to wait for Promise to resolve带有 Firestore 的 RN 无法等待 Promise 解决
【发布时间】:2018-12-08 22:58:44
【问题描述】:

我有一个简单的调用 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);
       });
     }
  });

 }

【问题讨论】:

    标签: react-native google-cloud-firestore


    【解决方案1】:

    我不确定您在这里遇到的确切问题,主要是因为您只展示了这一个功能,而不是您在应用程序的其余部分中如何使用它。但我可以肯定地告诉你三件事:

    1. 当来自 set() 的 promise 成功解析时,您可以确定文档已写入。
    2. get()set() 是异步的,then() 也是如此。他们都返回代表异步工作的承诺。
    3. 第 2 项意味着您的整个函数 updateDBEntry() 也是异步的,并在任何工作完成之前立即返回。

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

    【讨论】:

    • 那么我怎样才能让这个函数只有在文档写好之后才能解析呢?
    • 我漏掉了几个字。这个函数应该返回一个只有在所有工作完成后才解析的 PROMISE。
    • ahhh 好的,所以基本上这个函数本身需要向调用者返回一个promise,以便调用者知道文档已经写了。会做。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多