【问题标题】:Angular2 and RXJS, unsubscribe after data received onceAngular2和RXJS,收到一次数据后退订
【发布时间】:2016-11-28 15:32:56
【问题描述】:

我有一个只需要接收一次数据的订阅调用。 它所在的 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 订阅。我需要做些什么来确保在收到 first() 数据后清理所有内容吗?

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,但由于页面运行时间较长且不经常刷新,因此不会调用它。

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    first 不会为您订阅Observable

    例如,如果你这样做:

    Rx
      .Observable
      .of(1, 2, 3)
      .first()
      .map(x => console.log(x))
    &lt;script src="https://npmcdn.com/rxjs@5.0.0-beta.7/bundles/Rx.umd.js"&gt;&lt;/script&gt;

    什么都没发生。

    所以,你需要 subscribe 到那个 Observable ... 谁说 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();
    &lt;script src="https://npmcdn.com/rxjs@5.0.0-beta.7/bundles/Rx.umd.js"&gt;&lt;/script&gt;

    只需将subscription 保存在您的一个类变量中并实现onDestroy 方法:

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

    编辑 1:

    只是为了更清楚:

    如果您通过first(),它将如您所愿地取消订阅。

    但是,假设您的 observable 需要很长时间,并且您决定移动应用程序中的其他位置,并且组件被破坏。 observable 将保持活动状态(至少在它收到一个值之前)。

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

    【讨论】:

    • 感谢您提供的信息。如果页面长时间运行,ngOnDestroy 什么时候会触发?我认为这会在组件卸载时触发。我需要在第一次收到数据后进行此类清理。这仍然是这样做的方式吗?
    • @BenCameron 我可能不清楚,我编辑了我的帖子。
    • 如何使用first()按条件取消订阅响应?
    猜你喜欢
    • 2017-06-19
    • 2016-11-28
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 2016-11-17
    • 2017-09-21
    • 1970-01-01
    • 2017-08-28
    相关资源
    最近更新 更多