延迟补偿和Firestore交易

时间:2020-08-09 09:02:02

标签: google-cloud-firestore transactions

我有一个onSnapshot来跟踪集合中的文档:

StringIO

现在,我想选择用户尚未处理的文档集合的第一个(按某种顺序)元素。当用户处理完文档后,我将根据用户的需求使用事务来更新文档(对于我来说,事务比.update()更好,因为我可能有多个用户在更改文档的不同部分)。

问题在于,与.update(将立即更新mylocalvariable)不同的是,似乎事务在不更新mylocalvariable的情况下完成了。因此,当我去抓取“下一个”文档时,它只抓取同一文档,因为该函数在变量被更新之前运行。

代码示例:

db.collection('/.../').onSnapshot(querySnapshot=> mylocalvariable = querySnapshot.docs)

1 个答案:

答案 0 :(得分:0)

经过documentation之后,我认为这是预期的行为。

请勿在事务功能内部修改应用程序状态。这样做将引入并发问题,因为事务功能可以运行多次,并且不能保证在UI线程上运行。而是从交易功能中传递所需的信息

在任何情况下,您都可以过滤.where()未完成的文档,然后将事务放入foreach内:

db.collection('cities')
.where("done", "==", true)
.get()
.then(snapshot => {
  snapshot.forEach(doc => {
    return db.runTransaction(function(transaction) {
      return transaction.get(sfDocRef).then(function(sfDoc) {
         if (!sfDoc.exists) {
            throw "Document does not exist!";
         }
         transaction.update(sfDocRef, {done:true});
      });
   }).catch(function(error) {
     console.log("Transaction failed: ", error);
   });
  })
})