Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
<meta name="description" content="Callback Pattern Shift Gears">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>Callback Pattern Shift Gears</title>
</head>
<body>
</body>
</html>
 
const Bike = function(frontIndex, rearIndex){
  
  this.frontGearIndex = frontIndex || 0;
  this.rearGearIndex = rearIndex || 0; 
  
  this.transmission = {
    frontGearTeeth: [30,45],
    rearGearTeeth: [11,13,15,17,19,21,24,28,32,36]
  }
}
Bike.prototype.calculateGearRatio = function(){
  let front = this.transmission.frontGearTeeth[this.frontGearIndex],
      rear = this.transmission.rearGearTeeth[this.rearGearIndex];
  
  console.log(`front: ${front}, rear: ${rear}`);
  
  if (front && rear) {
    return (front / rear) ;
  } else {
    return 0; 
  }
  
};
Bike.prototype.changeGear = function(frontOrRear, changeBy) { 
  
  let shiftIndexName = frontOrRear + "GearIndex"
  
  //contains state change for making the shift
  let shiftObject = {
    currentIndex: this[shiftIndexName], 
    maxIndex: this.transmission[frontOrRear + "GearTeeth"].length,
    changeBy: changeBy
  }
  
  // invoke async function with anonymous callback
  // arrow function prevents anonymous function from spawning
  // a new 'this' reference to a new context
  this.changeGearAsync(shiftObject, (err, newIndex)=>{
    
    if (err) {
      console.log("No Change");
    } else {
      this[shiftIndexName] = newIndex; 
    }
    
  });
 };
/**
* take in shiftObject, create new gear state and pass back through callback
* if error, invoke callback with error
*/
Bike.prototype.changeGearAsync = function(shiftObject, callback){
  
  let newIndex = shiftObject.currentIndex + shiftObject.changeBy; 
  
  if (newIndex < 0 || newIndex > shiftObject.maxIndex) {
    callback(newIndex, null); 
  } else {
    callback(null, newIndex); 
  }  
};
const bike = new Bike(1,8);
console.log(bike.calculateGearRatio()); // 1.40625
bike.changeGear("front", -1);
console.log(bike.calculateGearRatio()); // 0.9375
bike.changeGear("rear", 1);
console.log(bike.calculateGearRatio()); // 0.83333...
bike.changeGear("front", -1);           // lower than zero so no change
console.log(bike.calculateGearRatio()); // 0.83333...
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
pchittumpro
0viewers