2016-09-21 21 views
0

これは簡単なことですが、私はちょっと疲れていて、混乱しています。DRxJs - (なぜ)Observableは新しいサブスクリプションで最新の値を出しますか?

私はangular2とRxJS Observablesを使っています。

私は、プロパティ "data"を持つサービスを持っています。これはコンストラクタで取得されるObservableと、このObservableを返すメソッドです。

export class test{ 
    private data: Observable<Object> 
    constructor(private http: Http){ 
     this.data = this.http.get(url).map(res => res.json()); 
    } 
    getData(): Observable<Object>{ 
     return this.data 
    } 
} 

私はずっと前にreplaySubjectsの作業をしていましたが、新しいサブスクライバにすべての値を常に出すようにしました。しかし、上記のコードでObservableは新しい加入者にとって最新の価値を発するようです。これは意図されていますか?

test(i: number) { 
     if (i > 0) { 
     setTimeout(() => { 
      this.dataService.getData().subscribe((data) => { 
      this.debug.log(data); 
      this.test(i-1); 
      }); 
     }, 2000); 
     } 
    } 
test(4) 

私はすべての繰り返しに対して値を取得します。私は混乱しています。なぜなら、1年前にその行動が欲しかったから、「あまりにも遅く」購読するときに私は新しい価値を持っていませんでした。 基本的には、http.getの結果をキャッシュし、すべてのサブスクライバに対して新しいhttpリクエストを作成するのではなく、getData()でhttp.get(url)を返すのではなく、 )

+0

'this.http.get(url).map(res => res.json())。share()'あなたは何をしますか? – estus

+0

私は混乱しています。あなたは、あなたが好きではないと思われる新しい加入者のために、オブザーバーが最後の価値を発していると言います。それからあなたはそれがあなたが望むものだと言います。それは何ですか? – acdcjunior

+0

申し訳ありませんが、電話や疲れて.....はい、それは私が望む方法を振る舞います。私はそれが意図されているかどうかは分かりません。なぜなら、それは1年前にそれがそのように働かなかったからです(少なくとも私はそれを考えます)。私は私が後で時間があるときに再びobservablesを読むべきだと思う。 – ch40s

答えて

0

いいえこれにはSubjectを使用する必要があります。それはあなたが新しく到着したプロパティをそれが加入者にプッシュするように送る方法next()を持っています。

これに加えて、シングルトンになるサービスを作成する必要があります。コンポーネントがコンストラクタでインスタンス化するたびに、すべてのデータで既に形成されているオブジェクトを受け取ります。毎回データを取得する必要はありません。

また、コンストラクタでデータをインスタンス化する代わりに、OnInitを実装し、そこからサーバーへの呼び出しを行います。

+1

これはサービス(this.dataService.getData())であり、私はng2 DIを使用するので、それは私のアプリケーションのスコープのシングルトンです。サービスはビュー/データバインドされた入力を持っていないので、私はコンストラクタを使用してもOKだと思いますか? – ch40s

+0

はい、あなたはそうです。 –

1

私はこの質問が少し古いことを知っていますが、答えは私にはかなり混乱しているようです。

getData()メソッドから返されるObservableはObservableです。だから、消費者が購読するたびに、それは応答を得る。だからうまくいっていますが、毎回新しいリクエストを出しています。

結果をキャッシュするには、必要な動作に応じてさまざまな方法があります。ちょうど単一の要求をキャッシュするために、私はtは#publishBehavior演算子を使用することをお勧めします:

export class test{ 
    private data: Observable<Object>; 
    constructor(private http: Http){ 
    this.data = this.http.get(url) 
     .map(res => res.json()) 
     .publishBehavior([]) 
     .refCount(); 
    } 
    getData(): Observable<Object>{ 
    return this.data; 
    } 
} 

publishBehaviorに渡されたパラメータは初期値です。この2つのオペレータでは、最初の加入者が到着したときに要求が行われます。次の加入者はキャッシュされた答えを得るでしょう。

他の人では、被験者の使用が提案されています。 publishBehaviorはフードの中のサブジェクトを使用しています。しかし、直接next()を呼び出すには、他の救済策がない限り、悪い習慣とみなされ、私の意見ではこのシナリオの場合はそうではありません。たとえSubjectを直接使用しても、#asObservable()演算子を使用してObservableをコンポーネントに戻すと、コンポーネントは次の、エラーのあるメソッドおよび完全なメソッドにアクセスできなくなります。

関連する問題