私はAngular 4アプリケーションを持っています。これはシステムのダッシュボードとして機能します。 複数の異なるコンポーネントが、同じTypeScriptサービスクラスを使用して同じバッキングREST呼び出しを呼び出します。これがうまくいく間に、クライアント側にキャッシュサービスを導入することで、サーバを叩く不必要な重複リクエストストームを回避したいと思います。折り返し角4観察可能なHTTP呼び出しを1つにキャッシングするためにObservable
私は、HTTPがcomputeFunction
として呼び出す渡し、私のサービスで使用されている(活字体で)私のキャッシング、このような何かを実装している:
@Injectable()
export class CacheService {
private cacheMap = {};
getAsObservable<V>(
key: string,
expirationThresholdSeconds: number,
computeFunction:() => Observable<V>): Observable<V> {
const cacheEntry = this.cacheMap[key];
if (...) {
// if cached entry is valid, return it immediately
return Observable.of<V>(cacheEntry.value);
} else {
// if not found or expired, call the method, and use map(...) to store the returned value
return computeFunction().map(returnValue => {
const expirationTime = new Date().getTime() + (expirationThresholdSeconds * 1000);
const newCacheEntry = ... // build cache entry with expiration set
this.cacheMap[key] = newCacheEntry;
return returnValue;
});
}
}
これはコールの場合、しかし、正常に動作しますkey
は、迅速に連続して(例えば、アプリケーションが起動しているときに)作成されますが、チェック時にキャッシュに戻り値がないため、すべてサーバーに対して起動します。
だから私は、私が代わりに何とか
- は一度だけ
computeFunction
に渡されたコールを実行していること、複数のキャッシュの呼び出し元に戻すことができます私自身のキャッシュ可能ラッパー「多重化」Observable
を実装する必要があり だと思う
- キャッシュ戻り値
- 各サブスクライバに値を返し、のように、HTTP
Observable
のように自分自身をクリーンアップします。
どうすればよいですか?
挑戦は
- サブスクリプションは、ラップ
computeFunction
戻る前に作られたときObservable
は、両方のケースを扱うべきであるということです。 (ラップされたObservable
がサブスクリプションを呼び出すまで待ちます)、 - ラップされたサブスクリプションは返されます。
computeFunction
が返されます。 (キャッシュされた値を提供)。
間違った方向に向かい、全体が複雑すぎるのですか?私が従うことができるより単純な概念があれば、それを学ぶことにもっと感謝します。
あなたは 'share'd observableやpromiseを値としてではなく保存してください。 – estus
私はあなたの現在の実装がかなり標準的だと思うし、あなたはaysncも待っている完璧なキャッシング機構を望んでいると思う。 Observableのようなストアを使用してキーと値を格納することができます。値はobservable.of(値)またはayncコールobservable(例:fetch(..)。fromPromise値=> ...)、しかし、私は詳細の実装がはるかに難しいと思う。 IMHOそれは価値がありません –
あなたが受け取った回答にフィードバックを提供し、あなたの質問に答えた場合は受け入れたものとしてマークしてください。 –