我正在嘗試向我的服務中的 HTTP 請求添加一個簡單的快取系統。這是我尚未成功的計劃。首先,呼叫服務,然后將回應存盤到一個集合中,如陣列或主題,如果下次服務呼叫而不是從服務器讀取,則從存盤該回應的陣列或主題中讀取它。我想在一個 PIPE 中使用這個服務,它從物件回傳一個字串。但出于某種原因忽略了我的情況。
我的源代碼
uj5u.com熱心網友回復:
發生這種情況是因為tap包含所有快取邏輯的邏輯是在回應到來后評估的,但是在您的應用程式中,您從一開始就進行了 4 個這樣的方法呼叫。解決這個問題,我建議存盤 observables,而不是它們的結果(因為您在呼叫時擁有 observable)并shareReplay可以使用共享結果運算子。
readedPlatformsCache: Record<number, Observable<IPlatform>> = {};
getPlatforms(id: number): Observable<IPlatform> {
const cachedPlatform = this.readedPlatformsCache[id];
if (!cachedPlatform) {
const request = this._http.get<any>('assets/platforms.json').pipe(
tap(() => console.log('http called')),
map((platforms: IPlatform[]) => platforms.find((p) => p.id === id)),
shareReplay(1),
);
return this.readedPlatformsCache[id] = request;
} else {
return cachedPlatform;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/393813.html
下一篇:HTTP請求充滿垃圾
