49

http サブスクリプションから Angular2 サービス内でサブスクライブを解除するベスト プラクティスは何ですか?

現在、私はこれを行っていますが、これが最善の方法になるかどうかはわかりません。

import { Injectable } from "@angular/core";
import { Http } from "@angular/http";

import { Subject } from "rxjs/Subject";
import { ISubscription } from "rxjs/Subscription";

@Injectable()
export class SearchService {
    private _searchSource = new Subject<any>();

    public search$ = this._searchSource.asObservable();

    constructor(private _http: Http) {}

    public search(value: string) {
        let sub: ISubscription = this._http.get("/api/search?value=" + value)
            .map(response => <any>response.json())
            .do(data => this._searchSource.next(data))
            .finally(() => sub.unsubscribe()).subscribe();
    }

}
4

4 に答える 4

129

Angular のサービスはシングルトンです。これは、サービスがアプリケーションの存続期間全体にわたって存在することを意味します。

オブザーバブルからサブスクライブを解除する必要がある理由は、メモリ リークを回避するためです。いつメモリリークが発生しますか? オブザーバブル、イベント リスナー、ソケットなどにまだサブスクライブされている間に何かがガベージ コレクションされた場合、...

アプリケーション全体が破棄されない限り、Angular サービスが破棄されることはないため、サブスクリプションを解除する本当の理由はありません。オブザーバブルは、アプリケーションが実行する限り、完了するか、エラーになるか、続行します。

結論: メモリ リークの可能性がないため、サービスのサブスクライブを解除するのは無意味です。

于 2016-11-30T10:00:40.223 に答える