首页 > 解决方案 > Firebase Firestore 在 for 循环中取消订阅 SnapShot

问题描述

我正在使用firebase firestore,并且我从集合中获取了一组数据,这些数据是我在for循环中的快照中拍摄的。

为了避免多次查询数据库,我创建了数据服务机制来使用本地数组进行显示,并且我正在通过 rxjs 主题行为来处理它。

这里的问题是,如果用户从应用程序中删除了一些文档,我已经从 firebase 中删除了它,然后从本地仍然是它的快照,我们必须手动取消订阅

我知道这样的基本方法..

var unsubscribe = db.collection("cities")
    .onSnapshot(function () {});
// ...
// Stop listening to changes
unsubscribe();

这不适用于我的情况,因为我正在像这样在 for 循环中拍摄快照

   getSnapShot() {
        this.global.currentUser.shortlist.forEach((propertyID: any) => {
          this.getSnapShotByID(ID);
        });
      }
    getSnapShotByID(ID) {
        // return new Observable((observe: Observer<any>) => {
        this.db.collection('properties').doc(propertyID).onSnapshot((snapshot: any) => {
//HERE I AM ADDING PROPERTY IN LOCAL ARRAY
    ....
    }

现在,当用户从集合中删除属性时,我必须取消订阅,否则它将继续侦听和更改我的本地数组

有什么建议吗?

标签: angularfirebasegoogle-cloud-firestore

解决方案


对于您的用例,我可以推荐以下方法

当您在 RXJS 主题中获取整个数据副本时。在 for 循环中发生删除的地方,删除现有 Rxjs 行为主题中不需要的数据,并在删除后使用 next 运算符再次重新推送新数据。因此,您的 observable 也会使用最新数据以及 firebase 数据库进行更新


推荐阅读