import { dateAdd } from "./DateHelpers"; export class CachedPromise<T> { private _dataPromise: PromiseLike<T> | undefined = undefined; private _dataDate: Date | undefined; constructor(private _dataFn: () => PromiseLike<T>, private _validMinutes: number = 20) { } async load(reload: boolean = false) { if (!this._dataPromise || reload || this.isExpired()) { this._dataDate = new Date(); return this.reload(); } return await this._dataPromise; } isExpired(): boolean { const expiryDate = dateAdd(new Date(), -1 * this._validMinutes * 60 * 1000); const isExpired = !this._dataDate || this._dataDate < expiryDate; return isExpired; } setExpired() { this._dataDate = undefined; } async reload() { this._dataPromise = this._dataFn(); return await this._dataPromise; } } // usage: const measurementsPromise = new CachedPromise<any>(() => restApiHelper.getData("api/measurements"), 10); measurementsPromise.load(); measurementsPromise.load(); // cached measurementsPromise.load(true); // not cached measurementsPromise.reload(); // not cached
220700cookie-checkTypescript CachedPromise