lazy expiry
lazy expiry
by ozzymcduff
HTML
<link rel="stylesheet" href="//code.jquery.com/qunit/qunit-2.3.2.css">
<script src="//code.jquery.com/qunit/qunit-2.3.2.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
JavaScript
function lazyExpiry(gen) {
var reference = null
var expiry = null
return function () {
let exp = expiry,
ref = reference
if (ref !== null && exp !== null && exp > Date.now()) {
return ref
}
var val = gen()
if (!val && val.length !== 2 && (typeof val[1] === 'number')) {
throw new Error('Expected return value of generator to be an array of two values, where the last value is a number (representing when it expires).')
}
ref = reference = val[0]
exp = expiry = new Date(Date.now() + val[1])
return ref
}
}
function t(ms) {
return new Promise(function(resolve, reject) {
setTimeout(resolve, ms);
});
}
var test = QUnit.test;
test("Basic test of lazy expiring value", function(assert) {
var done = assert.async();
var c = 1
function gen() {
let expiresIn = 100 // ms
return [c++, expiresIn]
}
var v = lazyExpiry(gen);
assert.equal(v(), "1", "initial value");
t(10).then(() => {
assert.equal(v(), "1", "snd value")
return t(10)
}).then(() => {
assert.equal(v(), "1", "thrd value")
return t(100)
}).then(() => {
assert.equal(v(), "2", "after 100 ms should gen next value")
}).then(done)
});