Created
January 18, 2019 04:36
-
-
Save dlucidone/d2d77f31566a2d7d85d738fb5143f60a to your computer and use it in GitHub Desktop.
Promise Implementation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class PromiseSimple { | |
constructor(executionFunction) { | |
this.promiseChain = []; | |
this.handleError = () => {}; | |
this.onResolve = this.onResolve.bind(this); | |
this.onReject = this.onReject.bind(this); | |
executionFunction(this.onResolve, this.onReject); | |
} | |
then(onResolve) { | |
this.promiseChain.push(onResolve); | |
return this; | |
} | |
catch(handleError) { | |
this.handleError = handleError; | |
return this; | |
} | |
onResolve(value) { | |
let storedValue = value; | |
try { | |
this.promiseChain.forEach((nextFunction) => { | |
storedValue = nextFunction(storedValue); | |
}); | |
} catch (error) { | |
this.promiseChain = []; | |
this.onReject(error); | |
} | |
} | |
onReject(error) { | |
this.handleError(error); | |
} | |
} | |
// ============================================================================== | |
fakeApiBackend = () => { | |
const user = { | |
username: 'treyhuffine', | |
favoriteNumber: 42, | |
profile: 'https://gitconnected.com/treyhuffine' | |
}; | |
// Introduce a randomizer to simulate the | |
// the probability of encountering an error | |
if (Math.random() > .05) { | |
return { | |
data: user, | |
statusCode: 200, | |
}; | |
} else { | |
const error = { | |
statusCode: 404, | |
message: 'Could not find user', | |
error: 'Not Found', | |
}; | |
return error; | |
} | |
}; | |
const makeApiCall = () => { | |
return new PromiseSimple((resolve, reject) => { | |
setTimeout(() => { | |
const apiResponse = fakeApiBackend(); | |
if (apiResponse.statusCode >= 400) { | |
reject(apiResponse); | |
} else { | |
resolve(apiResponse.data); | |
} | |
}, 5000); | |
}); | |
}; | |
makeApiCall() | |
.then((user) => { | |
console.log('In the first .then()'); | |
return user; | |
}) | |
.then((user) => { | |
console.log(`User ${user.username}'s favorite number is ${user.favoriteNumber}`); | |
return user; | |
}) | |
.then((user) => { | |
console.log('The previous .then() told you the favoriteNumber') | |
return user.profile; | |
}) | |
.then((profile) => { | |
console.log(`The profile URL is ${profile}`); | |
}) | |
.then(() => { | |
console.log('This is the last then()'); | |
}) | |
.catch((error) => { | |
console.log(error.message); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment