Callback functions

by lovinglobo

JavaScript

let i = 0;
console.log("Fuck you");


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

///


function writeFile(sectorA, sectorB) {
	console.log(`sectorA ${sectorA} sectorB ${sectorB}`);
}

// asynchronous sequential code
function getCdRomSectorsSequential(driveNrSectorNrs, resultCallbackFn) {
	//...
  console.log("implement me please!")
}

getCdRomSector(0, 0,(sectorZeroDriveZero) => {
	getCdRomSector(1, 1,(sectorOneDriveOne) => {
		writeFile(sectorZeroDriveZero, sectorOneDriveOne);
	});
});

// this should have the same result as the previous 5 lines
getCdRomSectorsSequential([[0, 0], [1, 1]], cdromSectors => {
	writeFile(cdromSectors[0], cdromSectors[1]);
})

// asynchronous parallel code

function hasUndefinedElements(arr) {
	// HOMEWORK, why is this the same as:
  // return arr.reduce((acc, e) => acc || e === undefined, false);
	let result = false;
  for (let j = 0; j < arr.length; j++) {
    if (arr[j] === undefined) result = true;
  }
	return result;
}

function getFnResultsInParallel(fn, arguments, resultCallbackFn) {
	let results = new Array(arguments.length); // [undefined, undefined]
  for (let i = 0; i < arguments.length; i++ ) {
  	fn(arguments[i][0], arguments[i][1], result => {
    	results[i] = result; // filling the empty slots
      
      // if all empty slots filled, call the callbackFn
      if (!hasUndefinedElements(results)) {
      	resultCallbackFn(results);
      }
    });  
  }
}

getFnResultsInParallel(getCdRomSector, [[0, 0], [1, 1]], (cdRomSectors) => {
	writeFile(cdRomSectors[0], cdRomSectors[1]);
});


let otherResult;
getCdRomSector(0, 0,(sectorZeroDriveZero) => { 
	/* ... */ 
  if (otherResult !== undefined) {
  	writeFile(sectorZeroDriveZero,...