【问题标题】:Angular 2 Subscribe / Unsubscribe Observables in case of http calls在 http 调用的情况下,Angular 2 订阅/取消订阅 Observables
【发布时间】:2016-10-27 16:02:36
【问题描述】:

我最近知道我们必须在 Angular 销毁组件之前取消订阅,否则可能会导致内存泄漏。

我也知道我们可以获取订阅的引用,并通过在该订阅上调用 unsubscribe 方法我们可以订阅。例如

private sub: any;

ngOnInit() {
  this.sub = this.route.params.subscribe(params => {
     let id = +params['id']; // (+) converts string 'id' to a number
     this.service.getHero(id).then(hero => this.hero = hero);
   });
}


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

在 HTTP 调用的情况下是否也需要这样做? 如果是,那么在这种情况下,最佳做法是什么。

例如,我们通常有这样的东西通过HTTP发布一些数据

let body = JSON.stringify({ name });
let headers = new Headers({ 'Content-Type': 'application/json' });
let options = new RequestOptions({ headers: headers });

this.http.post(this.heroesUrl, body, options)
                .map(this.extractData)
                .subscribe((data) => {
                 //do something with data
                })
                .catch(this.handleError);

以下方法是否有效,在 HTTP 调用的情况下,这是取消订阅的最佳方式吗?

private sub: any;

.....
....

this.sub = this.http.post(this.heroesUrl, body, options)
                .map(this.extractData)
                .subscribe((data) => {
                 //do something with data
                 this.sub.unsubscribe();
                })
                .catch(this.handleError);

【问题讨论】:

    标签: angular angular2-services


    【解决方案1】:

    不,没有必要取消订阅。简而言之,NG2 会自行清理,如 here 所示:

        if (response.ok) {
          responseObserver.next(response);
          // TODO(gdi2290): defer complete if array buffer until done
          responseObserver.complete();
          return;
        }
        responseObserver.error(response);
      };
    

    【讨论】:

    • 这里不仅会自动进行清理,而且会在Observable 完成的任何时候进行。 http 请求总是完成的,因为它们本质上只发出 1 个值,所以我们不需要清理它们 - Observable 链会自行清理。在这里查看我的答案stackoverflow.com/a/41177163/939634
    • 如果进行了 http 调用但尚未返回并且用户离开视图会发生什么?我认为在这种情况下,您将得到一个悬空订阅?
    猜你喜欢
    • 2017-03-26
    • 2020-10-28
    • 1970-01-01
    • 2019-05-06
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2018-10-06
    相关资源
    最近更新 更多