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);
});