2016-06-24 6 views
2

最近、Angularがコンポーネントを破壊する前にサブスクリプションの登録を解除する必要があることを知りました。そうしないとメモリリークが発生する可能性があります。Angular 2 Subscribe/Unsubscribe httpコールの場合のオブザーバブル

私は、サブスクリプションへの参照を取得でき、サブスクリプションでsubscribeメソッドを呼び出すことができます。たとえば、

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); 

答えて

3

いいえ、登録を解除する必要はありません。 here見られるように一言で言えば、NG2は、自身後にクリーンアップします。

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

をクリーンアップは、ここで自動的に発生するだけでなく、いつでも 'Observable'が完了起こります。 'http'要求は、その性質上、1つの値しか出さないので、常に完了します。したがって、' Observable'チェーンはそれ自身をクリーンアップします。ここで私の答えを参照してくださいhttp://stackoverflow.com/a/41177163/939634 – seangwright

+3

httpの呼び出しが行われたがまだ返されていない、ユーザーがビューを離れる場合はどうなりますか?私はその場合、あなたは迷惑なサブスクリプションが残っていると思いますか? – Thibs

関連する問題