2016-11-29 14 views
8

httpサブスクリプションからのAngular2サービス内での退会のベストプラクティスは何ですか?Angular2:サービスで観測可能なhttpからの退会

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

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

} 
+3

観測が完了すると、冗長で無意味になります。 –

+1

@günter-zöchbauerそれは私の質問が理にかなっていればそれは私の質問ではなかった:ベストプラクティスは何ですか?そう? –

+0

私は理にかなっていないものにはベストプラクティスがあるとは思わない:Dおそらくちょうど - それをしないでください。 –

答えて

19

アングル単位のサービスはシングルトンです。これは、アプリケーションがアプリケーションの全ライフサイクルにわたって存在することを意味します。

オブザーバブルからの退会が必要な理由は、メモリリークを避けるためです。あなたはいつメモリリークを取得しますか?監視可能なイベントリスナ、ソケット、などに登録されている間に何かがガベージコレクションされた場合...

Angularサービスは決して破壊されないので、アプリケーション全体が破壊されない限り、購読を中止する本当の理由はありませんそれ。オブザーバブルは、アプリケーションが実行している間、完了するかエラーになるか、または続行されます。

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

+0

答え@kwintenpをありがとう。しかし、上記のように、検索メソッドの呼び出しのたびに、データを取得するために登録する必要がある新しい観測値が作成されます。メモリリークを避けるためにサブスクリプションの登録を解除する必要はありませんでしたか? –

+1

これは大丈夫です。返されるすべてのサブスクリプションは自分自身をクリーンアップしますHTTPサービスは、それ自身の後でクリーンアップします。 XHRの結果が受信されると、サブスクリプションの完全メソッドが呼び出され、したがってサブスクリプションが解除されます。 しかし、httpサービスから返されたObservableに対してunsubscribeメソッドを呼び出す場合があります。 HTTPリクエストをキャンセルしたい場合は、「登録解除」と呼びます。これは、クリーンアップを完了するためにカバーの下で中止を呼び出します。 – Thibs

+5

"サービスがアプリケーションの全ライフサイクルにわたって存在する"ということは真実ではありません。私は、コンポーネントの寿命の間だけサービスを提供できるので、コンポーネントが破壊されたときに破棄されます。 –

関連する問題