2017-06-21 78 views
1

我想弄清楚为什么我看到的所有Angular应用程序都将订阅分配给一个变量,只能通过ngOnDestroy()取消订阅。例如:如果您未将其分配给变量,会发生什么情况?

export class ViewBookPageComponent implements OnDestroy { 
    actionsSubscription: Subscription; 

    constructor(store: Store<fromRoot.State>, route: ActivatedRoute) { 
    this.actionsSubscription = route.params 
     .select<string>('id') 
     .map(id => new book.SelectAction(id)) 
     .subscribe(store); 
    } 

    ngOnDestroy() { 
    this.actionsSubscription.unsubscribe(); 
    } 
} 

如果我只是完全删除actionsSubscription,会发生什么?订阅还会被创建但不会被销毁?在下面的情况下,您仍然会产生副作用,但不必麻烦取消订阅。垃圾收集所需的actionsSubscription也是如此?

export class ViewBookPageComponent { 

    constructor(store: Store<fromRoot.State>, route: ActivatedRoute) { 
    route.params 
     .select<string>('id') 
     .map(id => new book.SelectAction(id)) 
     .subscribe(store); 
    } 

} 

回答

1

你是对的,如果你删除actionsSubscription总之,subscription仍将被创建,但你不会通过ngOnDestroy能够unsubscribe从中,你离开组件后。如果未取消订阅,即使离开组件,observable仍可能保留流式数据,因此导致内存泄漏。因此,将可观察订阅分配给变量并强制unsubscribe可确保在组件被销毁时停止来自该可观察对象的数据流。

我从Brian Love的article了解了更多关于unsubscribe的信息。我从它注意到

一个重要的事情 -

如果您是通过使用AsyncPipe观察到的流,那么你不 需要担心退订。异步管道将照顾 为您订阅和取消订阅。

希望这会有所帮助。

+0

感谢您的快速响应!还有一个问题:如果我将.subscribe()放在一起,并且仅仅使用SelectAction副作用保留.map(),那该怎么办?由于没有用户,观察者会不会继续发射,还是会与组件一起死亡? –

+1

从angular.io开始,“subscribe()方法返回一个Subscription,一个Subscription不是另一个Observable,它是Observables的行尾,你不能再调用map()或再次调用subscribe()。订阅对象具有不同的用途,用其主要方法表示,取消订阅。“简而言之,可观察性直到订阅使用订阅()才会开始工作。 – Nehal

+0

明白了。谢谢。 –

相关问题