正确取消订阅Angular中的发布/放置/补丁/删除

时间:2018-06-19 12:50:01

标签: angular rxjs reactive-programming

我想知道取消订阅HTTP服务上的帖子/放置/补丁/删除的最佳方法是什么

例如,给定此方法,在页面中调用以保存对象:

public add(obj) {
const sub = this.service.post('/path/to/resource', obj).subscribe(()=>{
console.log('saved');
sub.unsubscribe();
});
}

我需要取消订阅吗?我是否正确取消了订阅?

已更新: 请注意,此添加方法将被多次调用!

更新2: 是的,它是HttpClient服务

4 个答案:

答案 0 :(得分:1)

以下内容可以正常工作,并且不会泄漏订阅:

public add(obj) {
    this.service.post('/path/to/resource', obj)
        .subscribe(() => {
            console.log('saved');
        });
}

Observable方法返回的HttpClient的任何订阅都将自动取消订阅。此处无需进行任何显式的订阅管理。

答案 1 :(得分:0)

  

我需要取消订阅

是的,如果您的页面有多个HTTP调用,并且您想要取消订阅路由/页面更改等方面的所有调用,那么您需要取消订阅所有调用。

  

我是否正确取消了订阅

否,您在调用后立即取消订阅HTTP呼叫,取消订阅HTTP呼叫的最佳位置是ngOnDestroy组件的生命周期挂钩 有角度的。像这样-

ngOnDestroy(){
   sub.unsubscribe();
}

答案 2 :(得分:0)

使用ngOnDestroy生命周期 const sub;

  public add(obj) {
    sub = this.service.post('/path/to/resource', obj).subscribe(()=>{
      console.log('saved');
      sub.unsubscribe();
    });
  }
  ngOnDestroy() { 
        sub.unsubscribe();
  }

如果您有多个可观察的订阅对象,那么我建议使用和订阅数组,然后销毁它。

private subscriptions: Subscription[] = [];

public add(obj) {
   subscriptions.push(this.service.post('/path/to/resource', obj).subscribe(()=> 
   {
    console.log('saved');
    sub.unsubscribe();
  }));
}
ngOnDestroy() {
    this.subscriptions.forEach(subscription => {
        subscription.unsubscribe();
    });
}

答案 3 :(得分:0)

不一定要退订,但最好的方法是退订以防止内存泄漏。

要做点什么:

add(obj){
    this.sub = this.service.post('/path/to/resource', obj).subscribe(()=>{
    console.log('saved');
    });
}

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