Promises
A promise is an Javascript object that has a job: go get a particular value. A promise can be in one of three states:
Pending: the promise is in the process of trying to retrieve the value
Fulfilled: the promise has successfully retrieved the value
Rejected: the promise was unable to retrieve the value
Analogy
“Imagine you are a kid. Your mom promises you that she’ll get you a new phone next week.”
You don’t know if you will get that phone until next week. Your mom can either really buy you a brand new phone, or she doesn’t, because she is not happy :(.
That is a promise. A promise has 3 states. They are:
Pending: You don’t know if you will get that phone
Fulfilled: Mom is happy, she buys you a brand new phone
Rejected: Mom is unhappy, she doesn’t buy you a phone
This example scenario is adapted from Javascript Promises for Dummies
Creating a Promise
When you create a new promise, you have to tell it what it's job is. Do this by giving it a callback function.
So, in our phone example:
The promise will pass 2 arguments into the callback: 1. a function to run if the value is successfully retrieved (resolve) 2. a function to run if the value is not successfully retrieved (reject)
Once a promise is fulfilled, then the promise will represent the value it was sent to retrieve.
Try changing isMomHappy
to a false
- what changes?
Consuming the Promise
Promises are generally consumed by attaching a .then().catch()
. .then()
triggered by the
resolve()
functionhandles what to do next with the retrieved data
.catch()
triggered by the
reject()
functionhandles the error
Run this code to see the .then()
callback run. Change isMomHappy
to false
to see the .catch()
in action!
Chaining Promises
You can chain multiple promises together using the .then()
function. In the callback function of the .then()
, just return the next promise you want to run:
Asyncronicity
Note that promises are asynchronous. If we add the following console.log()
statements, they wont necessarily run in the order we'd expect. Try it out!
How would you edit this code so that the final console.log
statement runs after the promises are fulfilled?
Exercise:
Imagine you are stuck at home with a sprained ankle, so you send your friend to the market to buy some pain medication. Your friend makes a promise to return with some pain medication for you. Once your friend has left for the market, the promise is pending. If your friend returns from the market with medication, the promise is fulfilled. If your friend returns from the market without medication, the promise is rejected.
Write code with promises to represent this scenario!
EVERYTHING BELOW THIS LINE IS ESSENTIALLY THE SAME CODE AS ABOVE, JUST GENERIC VERSIONS FOR FURTHER REVIEW IF DESIRED
Creating a Promise
When you create a new promise, you have to tell it what it's job is. Do this buy giving it a callback function.
The promise will pass 2 arguments into the callback: 1. a function to run if the value is successfully retrieved (resolve) 2. a function to run if the value is not successfully retrieved (reject)
Once a promise is fulfilled, then the promise will represent the value it was sent to retrieve.
Try changing valueToRetrieve
to a falsey value - what changes?
Consuming the Promise
Promises are generally consumed by attaching a .then().catch()
. .then()
triggered by the
resolve()
functionhandles what to do next with the retrieved data
.catch()
triggered by the
reject()
functionhandles the error
Run this code to see the .then()
callback run. Change valueToRetrieve
to a falsey value to see the .catch()
in action!
Chaining Promises
You can chain multiple promises together using the .then()
function. In the callback function of the .then()
, just return the next promise you want to run:
Asyncronicity
Note that promises are asynchronous. If we add the following console.log()
statements, they wont necessarily run in the order we'd expect. Try it out!
How would you edit this code so that the final console.log
statement runs after the promises are fulfilled?
More Resources
Last updated
Was this helpful?