2017-07-26 88 views
6

從我對Angular和RxJs的理解中,有兩種終止Observables的方法。你可以從他們unsubscribe()或使用takeUntil()complete()。以下是每種方法的示例(僞代碼)。Angular - 終止Observables的首選方法是什麼?

取消訂閱()方法

private _id: number; 
private _subscriptions: Subscription[] = []; 

constructor(private _route: ActivatedRoute) { 
    this._getId(); 
} 

public ngOnDestroy(): void { 
    this._subscriptions.forEach(
     subscription => subscription.unsubscribe() 
    ); 
} 

private _getId(): void { 
    this._subscriptions.push(
     this._route.params.subscribe(params => this._id = +params['id']) 
    ); 
} 

的takeUntil()和完全的()方法

private _id: number; 
private _ngUnsubscribe: Subject<void> = new Subject<void>(); 

constructor(private _route: ActivatedRoute) { 
    this._getId(); 
} 

public ngOnDestroy(): void { 
    this._ngUnsubscribe.next(); 
    this._ngUnsubscribe.complete(); 
} 

private _getId(): void { 
    this._route.params.takeUntil(this._ngUnsubscribe).subscribe(
     params => this._id = +params['id'] 
    ); 
} 

在角,有沒有終止觀測量的優選方法是什麼?

+2

的首選方式是在'ngOnDestroy',你在做什麼。我想補充的唯一一件事就是檢查值是「truthy」,意思不是空或不是不確定的,否則你會得到嘗試調用'退訂錯誤()'。 – Lansana

+1

並注意你往往不需要終止共同觀測,比如在你的榜樣路由器參數。角自動終止它們。看近的文檔的這部分底部的註釋:https://angular.io/guide/router#activatedroute-the-one-stop-shop-for-route-information – DeborahK

+1

參見[這個答案](HTTPS:/ /stackoverflow.com/a/41177163/2545680) –

回答

4

兩種方法都是正確的,即使它們不相同。

在我看來(和經驗)使用unsubscribe()通常更有意義,對於其他沒有豐富RxJS經驗的開發人員更爲明顯。

使用takeUntil()由RxJS 5的首席開發人員(https://medium.com/@benlesh/rxjs-dont-unsubscribe-6753ed4fda87)推薦,有時比處理多個訂閱對象更容易使用。例如,如果您使用partition()運算符將一個流拆分爲兩個,則只需使用takeUntil(...).partition(...)即可。

但是有兩個重要的事情:

  1. 這兩個是不一樣的。如果您使用的是takeUntil(),那麼您正在完成Observable鏈,這意味着將調用所有完整的句柄,然後執行拆卸功能。另一方面,當您撥打unsubscribe()時,只會調用拆卸功能(包括finally()等運營商)。

    這就是爲什麼我認爲使用unsubscribe()更合理。有了takeUntil(),即使您只想取消訂閱,也可以調用complete處理程序(不會提及此操作會觸發與complete信號配合使用的操作員,例如repeat()可能會重新訂閱)。您想取消訂閱的事實並不意味着源Observable已完成。你只是不關心它的值,所以在這種情況下使用unsubscribe()可能會更好。

    但是,在實踐中,無論您是完成產業鏈還是退訂,通常無關緊要。

  2. 您可以撰寫Subscription s轉換爲單一和退訂所有的人在一次:

    const subscription = new Subscription(); 
    
    const sub1 = Observable...subscribe(...); 
    const sub2 = Observable...subscribe(...); 
    const sub3 = Observable...subscribe(...); 
    
    subscription.add(sub1).add(sub2).add(sub3); 
    
    ... 
    
    subscription.unsubscribe(); // unsubscribes all of them 
    
0

我這樣做的方法是首先檢查ngOnDestroy,如果Observable存在。如果是,則取消訂閱。以下是我的應用程序的代碼片段。

accountSubscriptionObj : Subscription; 

ngOnDestroy() { 
    if (this.accountSubscriptionObj) { 
     this.accountSubscriptionObj.unsubscribe(); 
    } 
    } 

同時,你不需要從異步管道,@HostListener, 有限可觀察退訂。 當組件被破壞時,異步管道將自動取消訂閱,以避免潛在的內存泄漏。當你有一個有限的序列時,通常你不需要退訂,例如當使用HTTP服務或計時器可觀察時。更多參考read here

相關問題