2016-11-28 121 views
1

我有一个订阅呼叫,需要只接收一次数据。 其长时间运行的Angular 2页面。Angular2和RXJS,一次接收数据后取消订阅

我想确保订阅不会在内存泄漏和第一次收到数据时退订任何问题。

这是我的服务,使api查询。它使用.first,所以一旦收到一次数据就应该清理。

getData(): Observable<string> { 
    let _url = SOME_API_URL; 
    return this._http.get(_url).first().map((response: Response) => { return response.json(); }); 
} 

这是我的Ng2订阅。我需要做什么吗?确保在接收到第一个()数据后清理所有内容?

this._service.getData().subscribe((data: any) => { 
    // Do something once. 
    // DO I HAVE TO UNSUBSCRIBE OR WILL THE CLEANUP HAPPEN DUE TO THE ABOVE FIRST() CALL? 
}); 

我可以使用ngDestory,但不会被调用,因为页面长时间运行并且不经常刷新。

回答

3

first不会为您订阅Observable

例如,如果你这样做:

Rx 
 
    .Observable 
 
    .of(1, 2, 3) 
 
    .first() 
 
    .map(x => console.log(x))
<script src="https://npmcdn.com/[email protected]/bundles/Rx.umd.js"></script>

没有发生。

所以,你需要subscribeObservable ...是谁说subscribe说,你从它自己需要unsubscribe

let subscription = Rx 
 
    .Observable 
 
    .of(1, 2, 3) 
 
    .first() 
 
    .map(x => console.log(x)) 
 
    .subscribe(
 
    (success) => {}, 
 
    (error) => {}, 
 
    (done) => { console.log('unsubscribe') } 
 
); 
 

 
subscription.unsubscribe();
<script src="https://npmcdn.com/[email protected]/bundles/Rx.umd.js"></script>

只需保存在你的类变量之一subscription并实现onDestroy方法:

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

编辑1:

只是为了更清楚:

如果你经历first(),它会像你期望退订。

但是,假设您的可观察性需要很长时间,并且您决定移动到应用程序的其他位置,并且组件被破坏。可观测值将保持活跃状态​​(至少直到收到一个值)。

所以你应该仍然保持ngOnDestroy方法,以防你的组件在可观察组件被取消订阅之前被销毁。

+0

谢谢您的信息。如果页面长时间运行,那么ngOnDestroy会触发?我认为这会在组件卸载时触发。第一次收到数据后,我需要进行这种清理。这仍然是做到这一点的方法吗? –

+0

@BenCameron我可能一直不清楚,我编辑了我的帖子。 – Maxime