在Firestore中更新文档会导致无限循环

时间:2018-06-22 01:07:58

标签: javascript firebase google-cloud-firestore

因此,我尝试在firestore中更新文档,并在.forEach中进行此操作,并且在执行更新时会导致无限循环。有人可以看一下我的代码并告诉我如何停止它吗?我认为它只会运行一次,因为快照大小仅为1。

this.categoriesCollection.ref.where('name', '==', 
  transaction.category.toLowerCase()).limit(1).onSnapshot((querySnapshot) => 
    {
      if (querySnapshot.size == 1) {
        querySnapshot.forEach((doc) => {
          this.categoriesCollection.doc(doc.id)
            .update({totalSpent: doc.data().totalSpent + transaction.amount});
        });
      }
    });

2 个答案:

答案 0 :(得分:1)

您要在搜索查询中添加一个侦听器,以返回一个文档,然后对该文档进行更改。更改该文档后,查询结果将更改,并使用新结果再次调用您的侦听器,这意味着它将更新另一个文档,这意味着查询将更改。等等

如果您只想通过查询更新文档,请不要使用onSnapshot()。只需使用get()一次获得搜索结果,然后从搜索结果中更新文档即可。

答案 1 :(得分:0)

我发现我要做的就是将整个事情都设置为一个变量,然后在闭包结束时只需调用unsubscribe();即可停止循环。所以我的代码现在是:

let unsubscribe = this.categoriesCollection.ref.where('name', '==', transaction.category.toLowerCase()).limit(1).onSnapshot((querySnapshot) => {
  if (querySnapshot.size == 1) {
    querySnapshot.forEach((doc) => {
      this.categoriesCollection.doc(doc.id).update({totalSpent: doc.data().totalSpent + transaction.amount});
    });
  }
});
unsubscribe();