我们应该在哪里取消订阅Angular的SwUpdate.available?

时间:2018-05-25 02:23:15

标签: angular

在Angular的成员Stephen的视频中,他展示了"Updates and Notifications with the Angular Service Worker"

我们何时何地取消订阅Angular的SwUpdate.available?或者我们是否应该关注此订阅的开销,即使它没有取消订阅?

Stephen订阅了下面的代码。

  constructor(update: SwUpdate, push: SwPush, snackbar: MatSnackBar) {
    update.available.subscribe(update => {
      console.log('update available');
    });
}

2 个答案:

答案 0 :(得分:2)

不要听Pengyy。如果这些订阅可能会累积(从而产生内存泄漏),您应该取消订阅所有订阅。

我的意思是,如果订阅不在全局服务或实用程序类中,只调用一次,而是在一个Component(在用户点击应用程序时初始化和销毁​​),那么你应该做的事情如下:

private _destroy$ = new Subject();

ngOnDestroy(): void {
  this._destroy$.next();
}

constructor(private _store: Store<AppState>) {
  this._store.select(someReduxStream$).takeUntil(this._destroy$).subscribe(value => {/**/});
}

如果您不希望自己将此代码添加到应用中包含流的每个组件,则可以使用Aspect / Decorator,如:https://github.com/NetanelBasal/ngx-take-until-destroy

如果您知道某个地方的流只会使用一次,那么您可以在收到第一个值后取消订阅:

stream$.take(1).subscribe(value => {/**/});

答案 1 :(得分:0)

使用takeWhile并检查是否已启用服务工作者更新。只要它已启用,我们将继续订阅。

constructor(update: SwUpdate, push: SwPush) { update.available .pipe( takeWhile(() => this.swUpdate.isEnabled) ) .subscribe(update => { console.log('update available'); }); }