取消订阅订阅Angular的最简单方法

时间:2017-03-08 06:48:30

标签: angular rxjs

你对Angular很新。我有大约4个数据库查询,每个查询都是options.ondragover = options.ondragover || noop;。所以我知道我需要取消订阅每个订阅以节省内存泄漏。我该如何优化通话?我的意思是,我不想打电话给每个订阅并逐个取消订阅。我想在一次通话中取消订阅。对不起,如果这是一个愚蠢的问题。伙计们好吗?提前致谢

3 个答案:

答案 0 :(得分:5)

subscriptions = Subscription[];

someMethod() {
  this.subscriptions.push(http.get(...).map(...).subscribe(...));
}

ngOnDestroy() {
  this.subscriptions.forEach(s => s.unsubscribe());
}

当观察完成时,取消订阅是多余的。只有在不完成事件的情况下继续发出事件的观察者才需要取消订阅。

如果您只想接收单个(或其他有限数量的事件),您可以通过使用take(x)之类的运算符来控制您订阅的observable何时完成,然后在x个事件之后可观察到将完成。

答案 1 :(得分:0)

还有另一种有趣的方法:

@Component({ ... })
export class SomeComponent implements OnInit, OnDestroy {
  private componentDestroyed$ = new Subject();

  ...

  ngOnInit() {
    this.yourObs1$.takeUntil(componentDestroyed$).subscribe(...);
    this.yourObs2$.takeUntil(componentDestroyed$).subscribe(...);
    this.yourObs3$.takeUntil(componentDestroyed$).subscribe(...);
    ...
    this.yourObsX$.takeUntil(componentDestroyed$).subscribe(...);
  }

  ngOnDestroy() {
    this.componentDestroyed$.next();
    this.componentDestroyed$.complete();
  }
}

在这里,您甚至不需要跟踪订阅,而且您阅读的方式更加开发友好(我认为)。

Ben Lesh在http://www.jeasyui.com/easyui/demo/demo.css上解释了它,我喜欢这种取消订阅的方式!

答案 2 :(得分:0)

export class BaseComponent implements OnDestroy {

  protected alive$:  Subject<void> = new Subject<void>();
  ngOnDestroy(): void {
    // console.log("unsubscribing base component");
    this.alive$.next();
    this.alive$.complete();
  }
}

export class EveryComponent extends BaseComponent {
  this.AllObs1$.takeUntil(this.alive$).subscribe(...);
}