加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-17 17:46:41 所属栏目:安全 来源:网络整理
导读:我有一个订阅调用,只需要一次接收数据. 它开启的Angular 2页面长期运行. 我想确保订阅第一次收到数据后不会导致内存泄漏和取消订阅的任何问题. 这是我的服务,它提出了一个api查询.它使用.first,因此一旦收到数据就应该清理它. getData(): Observablestring {
我有一个订阅调用,只需要一次接收数据.
它开启的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之前被销毁.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读