Если вы хотите кэшировать его независимо от сеанса браузера, лучшим решением будет использование IndexDB браузера. Я создал службу indexDB для управления ею, но для ее обновления необходимо внести некоторые улучшения, если вы хотите использовать ее в работе.
export class IdbService {
static STORES = {
AGREEMENTS: 'agreements'
};
async getDb() {
return await openDB('my-db', 1, {
upgrade(db) {
for (const key in IdbService.STORES) {
const storeName = IdbService.STORES[key];
if (!db.objectStoreNames.contains(storeName)) {
db.createObjectStore(storeName);
}
}
}
});
}
}
Я изменил сервис для работы с обещаниями. Конечно, вы можете немного изменить его для работы с наблюдаемыми.
export class AgreementsService {
private baseUrl: string;
private data: AgreementsModel[];
constructor(
private idbService: IdbService,
private http: HttpClient,
private appService: AppConfigService,
public store: Store
) {
this.baseUrl = this.appService.getAppSettings().apiServer.agreements;
}
public async getOutstandingAgreements(userAgreementId?: number): Observable<AgreementsModel[]> {
let params = new HttpParams();
if (userAgreementId) {
params = params.set('userAgreementId', userAgreementId.toString());
}
const key = `outstanding-agreements__${userAgreementId.toString()}`;
const db = await this.idbService.getDb();
let result = await db.get(IdbService.STORES.AGREEMENTS, key);
if (result ?.length) {
return result ;
}
const result = await this.http.get<AgreementsModel[]>(`${this.baseUrl}outstanding-agreements`, {params}).toPromise();
await db.put(IdbService.STORES.AGREEMENTS, result, key);
return result;
}
}