メモリリークを回避するために、Http メソッドによって作成された Observable の登録を解除する必要がありますか? 質問する

メモリリークを回避するために、Http メソッドによって作成された Observable の登録を解除する必要がありますか? 質問する

メモリ リークを防ぐために、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に感謝します。

おすすめ記事