value changing Deferred pattern IV
what happens when we try to resolve a promise that is already resolved?
by Gerald Gillespie
JavaScript
/***** setup ****/
var desiredCallback = (resolve, reject, value, msg) => {
console.log('desiredCallback started');
setTimeout(() => {
resolve(value);
}, Math.random() * 5000);
}
/*** code ***/
const resolve_proxy = (value) => {
if (typeof valueCache.resolve === 'undefined') valueCache.resolve = value;
}
const resolver = (...values) => {
console.log('external resolve was requested');
console.log('proposed resolution values', values);
let value;
if (values.length)
value = values[0];
console.log('length of proposed resolution values: ', values.length)
if (typeof valueCache.resolve === 'undefined')
valueCache.resolve = value;
console.log('actual resolution values', valueCache.resolve);
if (values.length === 0)
value = valueCache.resolve;
if (Trigger.nativeResolve)
if (typeof values[0] === 'function') {
Trigger.nativeResolve(values());
return
} else {
Trigger.nativeResolve(value);
return;
}
}
//Deferred setup
const valueCache = {
resolve: undefined
}
const Trigger = {};
var callback = (resolve, reject) => {
Trigger.nativeResolve = (deferredValue, deferredMsg) => {
Trigger.nativeResolve = (x)=>{
console.log('ignore this call to resolve with', x)
}; // neuter resolve rom being called again;
new Promise((innerResolve, innerReject) => {
desiredCallback(
innerResolve,
innerReject,
deferredValue,
deferredMsg
);
}).then(resolve, reject);
}
};
let Deferred;
const setup = () => {
valueCache.resolve = undefined;
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)
}
return v;
})
}
/** comment the test you want to do */
setup();
resolver('force something...