Angular 清除订阅的更好方法

Var*_*eja 4 observable rxjs angular rxjs-subscriptions rxjs-observables

有很多方法可以在一个组件中有效地处理多个订阅,我在这里有 2 种方法,想知道哪种方法更有效,为什么?

方法一:使用数组

第 1 步:创建数组

private subscriptionArray: Subscription[];
Run Code Online (Sandbox Code Playgroud)

第 2 步:向数组添加订阅

this.subscriptionArray.push(this._storeManagementHttp.createStore(newStore).subscribe(resp => {
  this._toast.success('New store created');
}));
Run Code Online (Sandbox Code Playgroud)

第 3 步:迭代每个订阅和取消订阅

this.subscriptionArray.forEach(subs => subs.unsubscribe());
Run Code Online (Sandbox Code Playgroud)

方法二

第 1 步:创建新订阅

private subscriptions = new Subscription();
Run Code Online (Sandbox Code Playgroud)

第 2 步:添加订阅

this.subscriptions.add(this._storeManagementHttp.createStore(newStore).subscribe(resp => {
  this._toast.success('New store created');
  this._router.navigate(['/store-management']);
}));
Run Code Online (Sandbox Code Playgroud)

Step3:清除订阅

this.subscriptions.unsubscribe();
Run Code Online (Sandbox Code Playgroud)

Nik*_*oor 6

你也可以这个,在这种情况下你不需要运行循环

    private destroy$ = new Subject();
    
    myservice.megohd().pipe(takeUntil(destroy$)).subscribe();
    
    ngOnDestroy() {
      this.destroy$.next();
      this.destroy$.complete();
    }
Run Code Online (Sandbox Code Playgroud)

在这里阅读(https://www.learnrxjs.io/operators/filtering/takeuntil.html


Anu*_*ige 0

我更喜欢方法2。

\n\n

方法1没有问题。

\n\n
\n

它工作得很好。这种方法的问题在于我们将可观察流与普通的旧命令式逻辑混合在一起。

\n
\n\n

方法 2 是增强此方法的内置机制。

\n\n

在这里阅读

\n