ES6 Promises: A Simple but Comprehensive Guide

Christian Koranteng
3 min readMar 30, 2023

--

Asynchronous programming is an essential part of modern web development, but it can be a challenging concept to grasp. ES6 promises are a powerful tool for handling asynchronous operations, and they offer a clear, concise way to write code that is easy to read and understand. In this article, we’ll cover the basics of ES6 promises, including how to use them, how they work, and why they’re so useful.

Promises — How, Why, and What

At its core, a promise is an object that represents the eventual completion (or failure) of an asynchronous operation. When you create a promise, you’re essentially saying “I’ll do something asynchronous, and when it’s done, I’ll let you know.” The promise object has three states: pending, fulfilled, and rejected.

To create a new promise, you use the Promise constructor:

const promise = new Promise((resolve, reject) => {
// Do something asynchronous
});

The resolve and reject functions are provided as arguments to the constructor, and they're used to signal whether the asynchronous operation was successful or not. If the operation was successful, you call resolve with the result. If it wasn't, you call reject with an error message.

How to Use the then, resolve, and catch Methods

Once you’ve created a promise, you can use the then method to specify what should happen when the promise is fulfilled. The then method takes two arguments: a callback function that will be called when the promise is fulfilled, and a callback function that will be called if the promise is rejected.

promise.then(
result => {
// Do something with the result
},
error => {
// Handle the error
}
);

If you only need to handle the fulfillment of the promise and don’t care about any potential errors, you can omit the second argument to then and use the catch method instead:

promise.then(result => {
// Do something with the result
}).catch(error => {
// Handle the error
});

How to Use Every Method of the Promise Object

The Promise object provides several other methods besides then and catch that you can use to interact with promises. Here are some of the most commonly used:

  • Promise.all: Takes an array of promises and returns a new promise that is fulfilled when all of the promises in the array are fulfilled. If any of the promises are rejected, the returned promise is also rejected.
  • Promise.race: Takes an array of promises and returns a new promise that is fulfilled or rejected as soon as one of the promises in the array is fulfilled or rejected.
  • Promise.resolve: Returns a new promise that is already fulfilled with the given value.
  • Promise.reject: Returns a new promise that is already rejected with the given reason.

Throw / Try

One thing to keep in mind when working with promises is that they don’t catch errors that are thrown inside the asynchronous operation. If you need to catch these errors, you’ll need to use a try/catch block inside the promise.

const promise = new Promise((resolve, reject) => {
try {
// Do something synchronous that might throw an error
resolve(result);
} catch (error) {
reject(error);
}
});

The Await Operator

The await operator is a powerful tool for working with promises in a more synchronous style. It allows you to pause the execution of an async function until a promise is fulfilled, and then returns the result of the promise.

async function example() {
const result = await promise;

ES6 promises are a powerful tool for handling asynchronous programming in a clear and concise manner. They offer a simple and intuitive way to write code that is easy to read and understand, making it easier to create and maintain complex applications. By using promises, you can improve the performance and scalability of your code, and create applications that are more reliable and easier to debug.

In this article, we covered the basics of ES6 promises, including how to create them, how they work, and how to use them with the then, resolve, and catch methods. We also explored additional methods of the Promise object, such as Promise.all, Promise.race, Promise.resolve, and Promise.reject.

Furthermore, we discussed how to handle errors with throw/try blocks and how to work with promises in a more synchronous style using the await operator. With this comprehensive guide, you now have a solid understanding of how to use ES6 promises to create efficient and reliable asynchronous programming in your web applications.

--

--