# 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.