batchloader
Version:
BatchLoader is a utility for data fetching layer to reduce requests via batching written in TypeScript. Inspired by Facebook's DataLoader
61 lines • 1.72 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const mappedbatchloader_1 = require("./mappedbatchloader");
class CacheLoader {
constructor(loader, cache = new Map()) {
this.loader = loader;
this.cache = cache;
this.promiseCache = new Map();
}
load(key) {
const { promiseCache } = this;
let pv = promiseCache.get(key);
if (pv) {
return pv;
}
const value = this.cache.get(key);
pv =
value === undefined
? this.loader.load(key).then((val) => {
this.set(key, val);
return val;
})
: Promise.resolve(value);
promiseCache.set(key, pv);
return pv;
}
loadMany(keys) {
return Promise.all(keys.map((key) => this.load(key)));
}
mapLoader(mapFn) {
return new mappedbatchloader_1.MappedBatchLoader(this, mapFn);
}
get(key) {
let pv = this.promiseCache.get(key);
if (pv) {
return pv;
}
const v = this.cache.get(key);
if (v === undefined) {
return undefined;
}
pv = Promise.resolve(v);
this.promiseCache.set(key, pv);
return pv;
}
set(key, value) {
this.promiseCache.delete(key);
this.cache.set(key, value);
}
delete(key) {
const pDeleted = this.promiseCache.delete(key);
const deleted = this.cache.delete(key);
return pDeleted || deleted;
}
clear() {
this.promiseCache.clear();
this.cache.clear();
}
}
exports.CacheLoader = CacheLoader;
//# sourceMappingURL=cacheloader.js.map