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 stuck at home with a sprained ankle, so you send your friend to the market to buy some pain medication. Your friend is the promise. 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.
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 2. a function to run if the value is not successfully retrieved
Once a promise is fulfilled, then the promise will represent the value it was sent to retrieve.
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?
Promise.all()
Promise.all is a method that allows you to resolve multiple promises at the same time. This method will return a collection of values from each promise in the order that they were passed into promise.all as an iterable collection(array). We use promise.all when we have multiple asynchronous requests that need to be resolved before we can proceed with our task.
A real world example of using promise.all could be we are creating a website that requires information from various different sources and we cannot complete rendering of the webpage until all necessary information has been made available to us. We can create a promise for each of our external requirements and use promise.all to resolve all promises in our prerender steps and then once all of our required resources have been provided, we can begin rendering that content as needed.
Promise.all() basic example
Note that if you pass a non-promise into your collection of promises that promise will be wrapped in a generic promise, this is something that will only happen when using promise.all, there is no .then or .catch method extensions off of primatives and basic objects in javascript.
You’d want to use Promise.all instead of changing call backs, as changing callbacks with promises can become extremely tedious and difficult to maintain over time, as well, you will end up writing much more boilerplate code than is needed.
Promise.all() basic example but with callbacks
This code does the same thing as our code above, however we are not using promise.all and instead using just callbacks.
Catch in Promise.all()
Notice that catch can also be used with promise.all. An important thing to note when using catch and Promise.all is that as soon as any of your promises in your promise collection resolve with a rejection, the promise.all method will immediately jump to the catch statement and no other promises will resolve.
How would you edit this code so that the final console.log
statement runs after the promises are fulfilled?
More Resources
Last updated