Altcademy - a Forbes magazine logo Best Coding Bootcamp 2023

What is a promise in JavaScript

Understanding Promises in JavaScript

Promises in JavaScript are like a contract between two parties, where one party 'promises' to do something and the other party 'awaits' the result. This analogy isn't perfect, but it's a good start to understand the concept.

What is a Promise?

In technical terms, a Promise is an object representing the eventual completion (or failure) of an asynchronous operation and its resulting value. When we say 'asynchronous', we mean something that doesn't happen instantly or in a predetermined sequence. It's like calling a pizza delivery service. You place your order (start an operation), then you do other things (like watch TV) while waiting for the pizza to arrive (the operation to complete).

let pizzaDeliveryPromise = new Promise((resolve, reject) => {
    // ...pizza delivery process...
});

Anatomy of a Promise

A Promise is always in one of these states:

  1. Pending: The Promise's outcome hasn't yet been determined, because the asynchronous operation that will produce its result hasn't completed yet.
  2. Fulfilled: The asynchronous operation has completed, and the Promise has a result.
  3. Rejected: The asynchronous operation failed, and the Promise will never be fulfilled. In the "Rejected" state, a Promise has a reason that indicates why the operation failed.
let pizzaDeliveryPromise = new Promise((resolve, reject) => {
    let delivered = false;

    if (delivered) {
        resolve('Pizza Delivered!');
    } else {
        reject('Delivery Failed!');
    }
});

Using Promises

To use a Promise, you attach callbacks to it. These callbacks will receive either the Promise's eventual value or the reason why the Promise can't be fulfilled.

pizzaDeliveryPromise
    .then(message => {
        console.log(message); // This will run if the Promise is resolved
    })
    .catch(error => {
        console.log(error); // This will run if the Promise is rejected
    });

Chaining Promises

One of the great features of Promises is that they can be chained together. This means that you can execute multiple asynchronous operations one after the other, with each operation starting when the previous operation has completed.

orderPizza()
    .then(() => {
        return cookPizza();
    })
    .then(() => {
        return deliverPizza();
    })
    .then(() => {
        console.log('Pizza Delivered!');
    })
    .catch(error => {
        console.log('Failed to deliver pizza: ' + error);
    });

Error Handling

Error handling in Promises is done using the .catch() method. If an error (exception) is thrown inside a Promise, it will be caught in the next .catch() in the chain.

orderPizza()
    .then(() => {
        throw new Error('Oven is broken!');
        return cookPizza();
    })
    .catch(error => {
        console.log('Failed to cook pizza: ' + error);
        // Handle the error here
    });

Conclusion

Imagine a promise as a friendly robot assistant. You give it a task (the asynchronous operation). The robot then promises to complete the task and notify you when it's done, allowing you to go on with your day (run other code) without having to stand around waiting.

However, the robot might sometimes encounter problems (errors) that prevent it from completing the task. In that case, it will notify you as well, allowing you to handle the situation appropriately. This makes Promises in JavaScript a powerful tool for managing asynchronous operations, making our code cleaner and easier to understand.

And that's the beauty of a Promise! It's a simple concept that can be used to handle complex asynchronous operations, making your life as a developer a whole lot easier. Happy coding!