class CachedRun { constructor(period, request, postProcess, allwaysRun){ this.period = period; this.request = request; this.postProcess = postProcess || (el=>el); this.allwaysRun = allwaysRun || (el=>el); this.lastCall = 0; this.self = this; } getFreshResults(){ return Promise .resolve(this.request()) .then(res => this.postProcess(res)); } cacheResults(results){ if(results) { this.cache = results; this.lastCall = +new Date(); } return Promise .resolve(this.cache) .then(data => this.allwaysRun(data)); } start(){ return (new Date() - this.lastCall > this.period)? this.getFreshResults().then(res => this.cacheResults(res)) : this.cacheResults(); } }