value changing Deferred pattern III
a deferred pattern where you provide an original callback but then can change the value returned (if the promise is still pending)...
resolving with functions as args. e.g.
resolve( fn );
by Gerald Gillespie
June 12, 2021
JavaScript
/***** setup ****/
var desiredCallback = (resolve, reject) => {
console.log('already started');
setTimeout(()=>{
resolve('hi');
},Math.random()*5000);
}
/*** code ***/
const resolve_proxy = (value) => {
if (typeof valueCache.resolve === 'undefined') valueCache.resolve = value;
}
const resolver = (...values) => {
if( typeof values[0] === 'function'){
Trigger.nativeResolve( values() ){
}
}
let value;
if (values.length)
value = values[0];
console.log(values.length)
if (typeof valueCache.resolve === 'undefined')
valueCache.resolve = value;
if (values.length === 0 )
value = valueCache.resolve;
if(Trigger.nativeResolve)
Trigger.nativeResolve(value);
}
//Deferred setup
const valueCache = {
resolve: undefined
}
const Trigger = {};
var callback = (resolve, reject) => {
desiredCallback(resolver, reject);
Trigger.nativeResolve = resolve;
};
const setup = () => {
valueCache.resolve = undefined;
const Deferred = new Promise(callback).then(v => {
if (v === 'hi') {
console.log('the original requested value was used because no value was passwed to resolver', v);
} else {
console.log('something was passed to resolver so we used that instead', v)
}
})
}
/** comment the test you want to do */
setup();
//resolver('force something new');
setup();
//resolver();
setup();
//resolver(undefined);