需要取消订阅Firestore / Angularfire2订阅

时间:2018-09-03 09:58:25

标签: angular firebase ionic3 google-cloud-firestore angularfire2

我像这样使用Firestore。

用例1:

contacts$: Observable<ContactDetail[]>;

constructor(){    
} 

ionViewDidEnter() {
   this.contacts$ = this.contactProvider.getSpecificUserContacts(this.authenticationProvider.user.uid).valueChanges();
   this.contacts$.pipe(first()).subscribe(res => { },
      err => { },
      () => { }
   );
}

用例2:

getAllContactCategories() {
    this.categories$ = this.categoryProvider.getAllContactCategories().valueChanges();
    this.categories$.subscribe(res => {
       this.categorySortedList = res;          
    },
      err => { }
    );
}

但是我从来没有unsubscribed。那我需要这样做吗?否则会导致内存泄漏并消耗电池电量吗? 我知道我们不需要unsubscribed有角度的HTTP服务,因为它是由框架本身自动完成的。那Firestore / Angularfire2 observables呢?我从来没有见过这样的模式与消防处的书籍或文章之类的东西。

2 个答案:

答案 0 :(得分:2)

是的,最好取消订阅已订阅的订阅。你可以试试这个...

  contactsSub: Subscription;

constructor(){
}

ionViewDidEnter(){   ...   }

  ionViewDidLeave{
  this.contactsSub.unsubscribe();
  }

来自angularfire2代表: https://github.com/angular/angularfire2/issues/377

答案 1 :(得分:1)

通过使用first()运算符,您将在最初触发订阅后直接自动退订。但是要回答您的特定问题。

  

订阅组件中的可观察对象时,几乎总是在组件被破坏时取消订阅。   有一些不需要观察的异常观测值。可以看到ActivatedRoute的可观察项。   ActivatedRoute及其可观察物与路由器本身绝缘。当不再需要路由组件并且注入的ActivatedRoute随之死亡时,Router会销毁它。

     

随时可以退订。这是无害的,绝不是坏习惯。

来自https://angular.io/guide/route

通常,如果您希望控制何时取消订阅,可以将可观察对象分配给变量

const subscription = this.subscription$.valueChanges().subscribe(...);

然后在新创建的变量上调用unsubscribe。

subscription.unsubscribe();