# javascript ## Promise > https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-promise-27fc71e77261 >https://youtu.be/DHvZLI7Db8E - web dev simplified - JavaScript Promises In 10 Minutes A promise is an object which can be returned synchronously from an asynchronous function. It will be in one of 3 possible states: * Fulfilled: onFulfilled() will be called (e.g., resolve() was called) * Rejected: onRejected() will be called (e.g., reject() was called) * Pending: not yet fulfilled or rejected Making some requests using **callbacks** - ```javascript= function watchTutorialCallback(callback, errorCallback) { let userLeft = false let userWatchingCatMeme = false if (userLeft) { errorCallback({ name: 'User Left', message: ':(' }) } else if (userWatchingCatMeme) { errorCallback({ name: 'User Watching Cat Meme', message: 'WebDevSimplified < Cat' }) } else { callback('Thumbs up and Subscribe') } } ``` ```javascript= watchTutorialCallback(message => { console.log(message) }, error => { console.log(error.name + ' ' + error.message) }) ``` *callback hell* Making the same requests using **promises** - ```javascript= function watchTutorialPromise() { let userLeft = false let userWatchingCatMeme = false return new Promise((resolve, reject) => { if (userLeft) { reject({ name: 'User Left', message: ':(' }) } else if (userWatchingCatMeme) { reject({ name: 'User Watching Cat Meme', message: 'WebDevSimplified < Cat' }) } else { resolve('Thumbs up and Subscribe') } }) } ``` ```javascript= watchTutorialPromise().then(message => { console.log(message) }).catch(error => { console.log(error.name + ' ' + error.message) }) ``` Because .then() always returns a new promise, it’s possible to chain promises with precise control over how and where errors are handled.