【问题标题】:Angular rxjs memory leakAngular rxjs 内存泄漏
【发布时间】:2021-09-10 23:30:54
【问题描述】:

如果我有一个组件并且我想使用 takeuntil 取消订阅,从下面的 Before 切换到 After 会导致内存泄漏(使用多个主题时)

之前

class OnInit, OnDestroy{
private subjectA: Subject<TypeA> = new Subject();

public subjectA$: Observable<TypeA> = this.subjectA.asObservable();

ngOnDestroy {
    this.subjectA.complete();
}
}

之后

   class OnInit, OnDestroy{
    private subjectA: Subject<TypeA> = new Subject();
    private destroy$: Subject<boolean> = new Subject();
    
    public subjectA$: Observable<TypeA> = this.subjectA.asObservable.pipe(takeUntil(this.destroy$));
    
    onDestroy {
         this.destroy$.next(true);
         this.destroy$.unsubscribe();
    }
    }

我问的原因是私有主体永远不会真正被破坏——它只是停止从中获取。

【问题讨论】:

  • 你在哪里订阅它?如果您使用的是异步管道,则无需手动取消订阅
  • 它用于目前不允许异步管道的服务
  • 在 99% 的情况下,您不应该订阅服务,所以我会说开始在这里挖掘或尽可能分享更多代码

标签: angular rxjs observable


【解决方案1】:

代码中有错别字。它应该是“ngOnDestroy”,而不是“onDestroy”。

 Component implements OnDestroy {

  ngOnDestroy() {
    ...
  }
}

您也可能有兴趣使用ReplaySubject 而不是Subject 代替destroy$(在 99% 的情况下没有必要,但在 1% 的情况下,它可以防止“难以捕获”的内存泄漏) .

【讨论】:

  • 刚刚修复。现在调查 ReplaySubject 现在将进行研究。谢谢
【解决方案2】:

除了上面的答案,

此语法不正确。

public subjectA$: Observable&lt;TypeA&gt; = this.subjectA.asObservable(takeuntil(this.destroy$));

你应该把它改成

public subjectA$: Observable&lt;TypeA&gt; = this.subjectA.asObservable().pipe(takeUntil(this.destroy$));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-03
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多