ReactiveX/RxJsを新しく使いました。私の使用事例がRxJでスムーズに実行できるかどうか、できれば組み込み演算子を組み合わせて使用するのがよいでしょうか。ここに私が達成したいものがあります:RxJs5をAngular2で使用しているRESTクライアントのタイムベースキャッシュ
私は、REST APIと通信するAngular2アプリケーションを持っています。アプリケーションのさまざまな部分が異なる時間に同じ情報にアクセスする必要があります。同じリクエストを何度も繰り返してサーバーを叩くのを避けるために、私はクライアント側のキャッシュを追加したいと思います。キャッシングは、ネットワークコールが実際に行われるサービスレイヤーで行われます。このサービス層はObservable
を手渡すだけです。キャッシングは、アプリケーションの残りの部分に対して透過的でなければなりません。キャッシングではなく、Observable
を認識する必要があります。
最初に、60秒以内にサービスからこの情報を要求するコンポーネントが12個あっても、REST APIの特定の情報は60秒間に1回しか取得されません。各サブスクライバはサブスクリプション時にObservableから(単一の)最後の値を与えられなければなりません。
現在、私はこのようなアプローチでまさにそれを達成するために管理:
この例ではpublic getInformation(): Observable<Information> {
if (!this.information) {
this.information = this.restService.get('/information/')
.cache(1, 60000);
}
return this.information;
}
は、restService.get(...)
は、実際のネットワーク呼び出しを実行し、多くの角度のHTTPサービスのように、Observable
を返します。
このアプローチの問題点は、キャッシュをリフレッシュすることです。ネットワークコールが1回だけ実行され、キャッシュされた値が60秒後に新しいサブスクライバにプッシュされなくなるまで、キャッシュは再実行されませんキャッシュが期限切れになった後の最初の要求したがって、60秒のキャッシュの後に発生するサブスクリプションには、Observable
からの値は与えられません。
キャッシュがタイムアウトした後に新しいサブスクリプションが発生し、新しい値を60秒間再度キャッシュすると、最初のリクエストを再実行できますか?
ボーナスとして:既存のサブスクリプション(たとえば、最初のネットワークコールを開始した人)が、新しいサブスクリプションによってフェッチされたリフレッシュされた値を取得すると、情報がリフレッシュされるようにObservable-awareアプリケーション全体にすぐに渡されます。
感謝。残念ながら、これは望ましい動作を生成しません。このように実装された場合、最初の60秒間は結果がまったく存在しません。最初の60秒後に、要求が1回実行され、結果が加入者にプッシュされます。しかし、それ以上のリクエストは一度も実行されません。さらに、これはサービス層でのタイムポーリングを生成しますが、タイムドキャッシュの有効期限を持つキャッシュを探していました。 – netmikey
希望の動作に合わせて、回答を更新しました。あなたのものに非常によく似ていますが(これを書いた後に気がつきますが)、別の方法で実装されています。 –