Skip to content

Instantly share code, notes, and snippets.

@walterhiggins
Created June 26, 2015 06:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save walterhiggins/5772a8a81babec91894e to your computer and use it in GitHub Desktop.
Save walterhiggins/5772a8a81babec91894e to your computer and use it in GitHub Desktop.
/*
testing a forgetful memoized promise: A promise, memoized which is forgotten after a given duration.
*/
var Q = require('q');
var _ = require('underscore');
function expensive( req ){
var result = Q.defer();
var msg = JSON.stringify(req);
console.log(new Date() + ' about to do something expensive: ' + msg);
setTimeout(function(){
console.log('expensive op complete: ' + msg);
result.resolve('boo ' + msg);
}, 4200);
return result.promise;
}
function log( result ){
console.log(new Date() + ' ' + result);
}
function hasher(req){
return req.id;
}
function forget(expensive, lapsed, hasher){
var memoized = _.memoize(expensive, hasher);
if (!memoized.forgetting){
memoized.forgetting = {};
}
return function(){
var result = memoized.apply(null,arguments); // warning null
var hash = hasher.apply(null,arguments); // warning null
if (!memoized.forgetting[hash]){
memoized.forgetting[hash] = true;
setTimeout(function(){
delete memoized.cache[hash];
delete memoized.forgetting[hash];
},lapsed);
}
return result;
};
}
var forgetful = forget(expensive, 12000, hasher);
var t = 30;
function loop(){
if (t > 0){
forgetful({id: t % 3 }).then(log);
setTimeout(loop, 1000);
t--;
}
}
loop();
module.exports = forget;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment