My Promise

by lovinglobo

JavaScript

class MyPromise {
	constructor(fulfillmentFn) {
  	if (typeof fulfillmentFn == "function") {	
  		fulfillmentFn(result => {
    		this.result = result;
	  		if (this.onResolve) {
     	 		this.onResolve(result);
     		}
    	})
  	} else {
    	this.result = fulfillmentFn;
    }
  }
  
  then(callbackFn) {
		if (this.result) {
    	const callbackResult = callbackFn(this.result);
      if (callbackResult instanceof MyPromise) {
      	return callbackResult;
      } else {
      	return new MyPromise(r);
      }
    } else {
      return new MyPromise(resolve => {
	    	this.onResolve = result => {
        	if (result instanceof MyPromise) {
          	if (result.result !== undefined) {
            	resolve(callbackFn(result.result));
            } else {
	          	result.onResolve = resultOfInnerPromise => {
  	          	resolve(callbackFn(resultOfInnerPromise));
    	        };
            }
          } else {
  		      resolve(callbackFn(result));
         	}
    	  };
      })
    }
  }
}


function getCdRomSector(driveNr, sectorNr) {
	// do something semi-intelligble here
  //...
  //...
  const cdRom = 
  	[
    	["0101010101", "1101010110", "11111111111"], // drive 0
      ["2222211451", "1101124121240", "11523235111"] // drive 1
    ];
   
  return new MyPromise(resolveFn  => {
  	setTimeout(() => {
  		const sectorData = cdRom[driveNr][sectorNr];
      return resolveFn(sectorData);
	  }, 10);
	});
}

// sequential code without staircase!!!
new MyPromise(5).then(sectorData => {
  console.log("seq1", sectorData);
  return getCdRomSector(0, 0);
}).then(sectorData2 => {
  console.log("seq2", sectorData2);
});