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...