私は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 グリッド自体が作成されたときに一度呼び出すと、そのデータをコンポーネントに渡すことができます。しかし、私はそれを避けたい、二つの理由がある:まず、コンポーネントは比較的自給自足でなければならない。他の場所でコンポーネントを使用する場合、親コンポーネントにデータをキャッシュする必要はありません。次に、アプリケーションのどこかに適用できる短期間のキャッシュパターンを見つけたいと思います。私はこれに取り組んでいる唯一の人ではなく、コードをきれいに保ちたい。
私はこの情報でポストを更新しますが、発信者コードがコンポーネント内にある間、 'share()'と 'RelaySubject()'コードがサービス内にあります。 –