2017-06-25 19 views
3

在Angular 2中,有些觀察對象不需要取消訂閱。例如http請求和activatedRoute.params。在Angular 2的rxjs中使用switchMap操作符時,我們是否需要取消訂閱?

Angular/RxJs When should I unsubscribe from `Subscription`

但是當我使用switchMap上例如activatedRoute.params和switchMap裏面我訪問返回一個可觀察的,如果按照通常的方式認購,將需要退訂服務會發生什麼。

事情是這樣的:

this.activatedRoute.params 
    .switchMap((params: Params) => this.userService.getUser(+params['id'])) 
    .subscribe((user: User) => this.user = user); 

如果我叫this.userService沒有switchMap,沒有activatedRoute.params我將不得不從它退訂。

// userService.getUser() takes in optional id?: number. 
this.subscription = this.userService.getUser().subscribe(
    (user: User) => { 
     this.user = user; 
    } 
); 

再後來..

this.subscription.unsubscribe(); 

我的問題是,我需要從activatedRoute.params退訂,如果我用它switchMap和調用將需要退訂,否則服務?

+0

我認爲你應該總是退訂路由器 –

回答

5

如果您要訂閱的可觀察源始終完成或發生錯誤,則無需取消訂閱。

但是,如果您使用switchMap編寫了另一個源代碼的可觀察值,則無論是否需要取消訂閱取決於switchMap中返回的可觀察值。如果返回的observable並不總是完成或錯誤,那麼,是的,您將需要取消訂閱。

如果源誤差,會發生自動退訂:

const source = new Rx.Subject(); 
 
const composed = source.switchMap(() => Rx.Observable.interval(200)); 
 

 
composed.subscribe(value => console.log(value)); 
 
source.next(1); 
 

 
setTimeout(() => { 
 
    console.log("Erroring..."); 
 
    source.error(new Error("Boom!")); 
 
}, 1000);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/[email protected]/bundles/Rx.min.js"></script>

然而,如果源完成後,也不會發生自動退訂:

const source = new Rx.Subject(); 
 
const composed = source.switchMap(() => Rx.Observable.interval(200)); 
 

 
composed.subscribe(value => console.log(value)); 
 
source.next(1); 
 

 
setTimeout(() => { 
 
    console.log("Completing..."); 
 
    source.complete(); 
 
}, 1000);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://unpkg.com/[email protected]/bundles/Rx.min.js"></script>

相關問題