我有一个订阅调用,只需要一次接收数据.
它开启的Angular 2页面长期运行.
它开启的Angular 2页面长期运行.
我想确保订阅第一次收到数据后不会导致内存泄漏和取消订阅的任何问题.
这是我的服务,它提出了一个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? });
解决方法
首先不会为您订阅Observable.
例如,如果您这样做:
Rx .Observable .of(1,2,3) .first() .map(x => console.log(x))
<script src="https://npmcdn.com/rxjs@5.0.0-beta.7/bundles/Rx.umd.js"></script>
什么都没发生.
所以,你需要订阅那个Observable ……谁说订阅说你需要自己取消订阅.
let subscription = Rx .Observable .of(1,3) .first() .map(x => console.log(x)) .subscribe( (success) => {},(error) => {},(done) => { console.log('unsubscribe') } ); subscription.unsubscribe();
<script src="https://npmcdn.com/rxjs@5.0.0-beta.7/bundles/Rx.umd.js"></script>
只需将订阅保存在您的一个类变量中并实现onDestroy方法:
ngOnDestroy() { this.subscription.unsubscribe(); }
编辑1:
为了更清楚:
如果您通过first(),它将按照您的预期取消订阅.
但是,假设您的observable需要很长时间,并且您决定移动到应用程序中的其他位置,并且组件被破坏.观察者将保持活力(至少在它收到一个值之前).