290

メモリ リークを防ぐために、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());
            ...
4

11 に答える 11

27

メソッドを呼び出すことunsubscribeは、進行中の HTTP リクエストをキャンセルすることです。このメソッドは、abort基になる XHR オブジェクトのリクエストを呼び出し、ロード イベントとエラー イベントのリスナーを削除するためです。

// From the XHRConnection class
return () => {
  _xhr.removeEventListener('load', onLoad);
  _xhr.removeEventListener('error', onError);
  _xhr.abort();
};

そうは言っても、unsubscribeリスナーを削除します...それは良い考えかもしれませんが、単一のリクエストには必要ないと思います;-)

お役に立てば幸いです、ティエリー

于 2016-01-27T16:42:58.137 に答える
8

この記事は絶対に読むべきです。http からでも常に購読を解除する必要がある理由を示しています。

リクエストを作成した後、バックエンドからの応答を受信する前に、コンポーネントが不要であると判断して破棄した場合、サブスクリプションはコンポーネントへの参照を維持するため、メモリ リークが発生する可能性が生じます。

アップデート

上記の肯定は本当のようですが、とにかく、答えが返ってきたら、http サブスクリプションはとにかく破棄されます

于 2019-03-13T09:16:48.700 に答える
-2

RxJS オブザーバブルは基本的に関連付けられており、それに応じてサブスクライブします。オブザーバブルを作成し、それを完了する動きを作成すると、オブザーバブルは自動的に閉じられ、サブスクライブが解除されます。

それらはウォッチャーと同じように機能しますが、順序はまったく異なります。コンポーネントが破棄されたときにそれらをサブスクライブ解除することをお勧めします。this.$manageSubscription.unsubscibe()

以下のような構文のようにオブザーバブルを作成した場合

** return new Observable((observer) => { ** // コールド状態でオブザーバブルにする **observer.complete() **}) **

于 2018-08-12T11:39:35.480 に答える