我有一个onSnapshot来跟踪集合中的文档:
StringIO
现在,我想选择用户尚未处理的文档集合的第一个(按某种顺序)元素。当用户处理完文档后,我将根据用户的需求使用事务来更新文档(对于我来说,事务比.update()更好,因为我可能有多个用户在更改文档的不同部分)。
问题在于,与.update(将立即更新mylocalvariable)不同的是,似乎事务在不更新mylocalvariable的情况下完成了。因此,当我去抓取“下一个”文档时,它只抓取同一文档,因为该函数在变量被更新之前运行。
代码示例:
db.collection('/.../').onSnapshot(querySnapshot=> mylocalvariable = querySnapshot.docs)
答案 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);
});
})
})