メモリ リークを防ぐために、Angular 2 の http 呼び出しの登録を解除する必要がありますか?
fetchFilm(index) {
var sub = this._http.get(`http://example.com`)
.map(result => result.json())
.map(json => {
dispatch(this.receiveFilm(json));
})
.subscribe(e=>sub.unsubscribe());
...
ベストアンサー1
答えは「いいえ、必要ありません」です。Ng2
自動的にクリーンアップされます。
Angular の Http XHR バックエンド ソースからの Http サービス ソース:
結果を取得した後にどのように実行されるかに注目してくださいcomplete()
。これは、完了時に実際に登録解除されることを意味します。したがって、自分で行う必要はありません。
検証するためのテストは次のとおりです。
fetchFilms() {
return (dispatch) => {
dispatch(this.requestFilms());
let observer = this._http.get(`${BASE_URL}`)
.map(result => result.json())
.map(json => {
dispatch(this.receiveFilms(json.results));
dispatch(this.receiveNumberOfFilms(json.count));
console.log("2 isUnsubscribed",observer.isUnsubscribed);
window.setTimeout(() => {
console.log("3 isUnsubscribed",observer.isUnsubscribed);
},10);
})
.subscribe();
console.log("1 isUnsubscribed",observer.isUnsubscribed);
};
}
予想どおり、結果を取得して Observable 演算子が終了した後は、常に自動的にサブスクライブ解除されることがわかります。これはタイムアウト (#3) で発生するため、すべて完了したときに Observable のステータスを確認できます。
そしてその結果
Ng2
したがって、自動登録解除による漏洩は発生しません。
言及しておくと良い点: これはObservable
として分類されますがfinite
、これは とは対照的に、 は DOMリスナーinfinite
Observable
のようにデータの無限ストリームを生成できます。click
この件について助けてくれた@rubyboyに感謝します。