UNPKG

@stnekroman/tstools

Version:

Set of handy tools for TypeScript development

58 lines (57 loc) 1.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ThrottledCache = void 0; const LoadingCache_1 = require("./LoadingCache"); const Deffered_1 = require("../Deffered"); const Throttle_1 = require("../throttle/Throttle"); class ThrottledCache extends LoadingCache_1.LoadingCache { constructor(timeout = 200, mapImpl = new Map()) { super(mapImpl); this.queue = []; this.throttledLoadFn = Throttle_1.Throttle.debounce(() => { this.processQueue(); }, timeout); } get(...args) { if (super.has(...args)) { return super.get(...args); } const defferedTask = { args: args, deffered: new Deffered_1.Deffered(), }; this.queue.push(defferedTask); super.put(defferedTask.deffered.promise, ...args); this.throttledLoadFn(); return defferedTask.deffered.promise; } loadAll(argsArray) { return Promise.allSettled(argsArray.map((args) => this.load(...args))); } processQueue() { const tasks = this.queue.slice(); this.queue.length = 0; if (tasks.length > 0) { this.loadAll(tasks.map((task) => task.args)).then((results) => { for (let i = 0; i < tasks.length; i++) { const result = results[i]; if (result.status === 'fulfilled') { tasks[i].deffered.resolve(result.value); } else { tasks[i].deffered.reject(result.reason); } } }); } } clear() { super.clear(); const tasks = this.queue.slice(); this.queue.length = 0; for (const task of tasks) { task.deffered.reject('clear cache'); } } } exports.ThrottledCache = ThrottledCache;