2017-04-06 7 views
2

私はAngularサービスで短期間のキャッシュを実装しようとしています。サブコンポーネントの束は急速に連続して作成され、それぞれにHTTP呼び出しがあります。私はページがロードされている間にそれらをキャッシュしたいが、永遠ではない。share()とReplaySubject:どれがどちらかどちらも動作していない

次の2つの方法を試しましたが、どちらも効果がありませんでした。いずれの場合も、作成されたコンポーネントのインスタンスごとにHTTP URLが1回ヒットします。私はそれを避けたい - 理想的には、グリッドが作成されるとURLが一度ヒットし、キャッシュが期限切れになり、次回にURLにヒットするコンポーネントを作成する必要があります。 StackOverflow上の他のスレッドから両方のテクニックを取得しました。

(サービス中)株()

getData(id: number): Observable<MyClass[]> { 
    return this._http.get(this.URL) 
     .map((response: Response) => <MyClass[]>response.json()) 
     .share(); 
} 

ReplaySubject(サービス中)

private replaySubject = new ReplaySubject(1, 10000); 
getData(id: number): Observable<MyClass[]> { 
    if (this.replaySubject.observers.length) { 
     return this.replaySubject; 
    } else { 
     return this._http.get(this.URL) 
      .map((response: Response) => { 
       let data = <MyClass[]>response.json(); 
       this.replaySubject.next(data); 
       return data; 
      }); 
    } 
} 

(成分で)発信者

ngOnInit() { 
    this.myService.getData(this.id) 
     .subscribe((resultData: MyClass[]) => { 
      this.data = resultData; 
     }, 
     (error: any) => { 
      alert(error); 
     }); 
} 

コンポーネントが作成されるたびにURLをヒットする必要はありません。同じデータが返され、コンポーネントを含む行のグリッドではデータは同じになります。 I グリッド自体が作成されたときに一度呼び出すと、そのデータをコンポーネントに渡すことができます。しかし、私はそれを避けたい、二つの理由がある:まず、コンポーネントは比較的自給自足でなければならない。他の場所でコンポーネントを使用する場合、親コンポーネントにデータをキャッシュする必要はありません。次に、アプリケーションのどこかに適用できる短期間のキャッシュパターンを見つけたいと思います。私はこれに取り組んでいる唯一の人ではなく、コードをきれいに保ちたい。

答えて

3

重要なことに、Angularコンポーネントを作成/破棄しても永続化したい場合、そのコンポーネントでは作成できませんが、コンポーネント間で共有されるサービスには作成できません。

RxJSに関しては、通常ReplaySubjectを直接使用する必要はなく、代わりにpublishReplay(1, 10000)->refCount()を使用してください。

share()オペレータは、を内部的に使用するpublish()->refCount()の略語であり、キャッシュされた値を再生しないことを意味します。

+0

私はこの情報でポストを更新しますが、発信者コードがコンポーネント内にある間、 'share()'と 'RelaySubject()'コードがサービス内にあります。 –

関連する問題