Angular2和RXJS,在收到一次数据后取消订阅

前端之家收集整理的这篇文章主要介绍了Angular2和RXJS,在收到一次数据后取消订阅前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个订阅调用,只需要一次接收数据.
它开启的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?
});

我可以使用ngDestory,但由于页面长时间运行而且不经常刷新,因此不会被调用.

解决方法

首先不会为您订阅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需要很长时间,并且您决定移动到应用程序中的其他位置,并且组件被破坏.观察者将保持活力(至少在它收到一个值之前).

所以你仍然应该保留ngOnDestroy方法,以防你的组件在取消订阅observable之前被销毁.

猜你在找的Angularjs相关文章