@stnekroman/tstools
Version:
Set of handy tools for TypeScript development
58 lines (57 loc) • 1.92 kB
JavaScript
;
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.throttle(() => {
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;