Skip to main content

Command Palette

Search for a command to run...

JavaScript Promises Explained for Beginners

Updated
3 min read
JavaScript Promises Explained for Beginners

1. The Core Concept: A Future Value

The best way to understand a Promise is to think of it like a restaurant buzzer. When you order food at a busy restaurant, they don't give you your food immediately. Instead, they give you a buzzer. That buzzer is a Promise that eventually, you will get your food. You can go sit down, talk to your friends, or drink water (run other code) while the kitchen prepares the meal (the asynchronous task).

In JavaScript, a Promise is an object representing the eventual completion (or failure) of an asynchronous operation and its resulting value.

2. The Problem Promises Solve: Callback Hell

Before Promises, developers used callbacks—functions passed as arguments to be executed later—to handle asynchronous tasks. If you had to do a series of tasks in order (e.g., fetch user data, then fetch their posts, then fetch comments on those posts), callbacks forced you to nest them inside one another. This created deeply indented, hard-to-read code famously known as Callback Hell or the "Pyramid of Doom."

The Callback Way (Hard to read):

getUser(userId, function(user) {
    getPosts(user.id, function(posts) {
        getComments(posts[0].id, function(comments) {
            console.log("Finally got the comments!", comments);
        }, function(error) );
    }, function(error));
}, function(error) );

The Promise Way (Flat and readable):

getUser(userId)
    .then(user => getPosts(user.id))
    .then(posts => getComments(posts[0].id))
    .then(comments => console.log("Finally got the comments!", comments))
    .catch(error => console.error("Something went wrong!", error));

Promises flatten the structure, making the flow of logic top-to-bottom rather than left-to-right.

3. The Promise Lifecycle and States

A Promise in JavaScript is always in one of three distinct states:

  • Pending: The initial state. The buzzer is in your hand, but it hasn't gone off yet. The operation is still ongoing.

  • Fulfilled (Resolved): The operation completed successfully. The buzzer flashes; your food is ready.

  • Rejected: The operation failed. The waiter comes out and says they ran out of the ingredients you ordered.

Note: Once a promise is fulfilled or rejected, it is considered settled. A settled promise cannot change its state ever again.

4. Handling Success and Failure

When you receive a Promise from a function (like fetching data from an API), you use special methods to unpack that "future value":

  • .then(): This block executes only if the promise is Fulfilled. It receives the successful data as its argument.

  • .catch(): This block executes only if the promise is Rejected. It receives the error information so you can handle it gracefully.

  • .finally(): (Optional) This block runs regardless of whether the promise succeeded or failed. It's great for cleanup tasks, like hiding a loading spinner.

5. Promise Chaining

Because .then() and .catch() actually return new Promises themselves, you can chain them together.

If a .then() block returns a value, the next .then() in the chain receives that value. If any step in the chain fails, JavaScript immediately skips all remaining .then() blocks and jumps straight to the nearest .catch(). This means you only need one .catch() at the very end to handle errors for the entire chain.


Promises are a massive leap forward for code readability, but JavaScript eventually introduced an even cleaner syntax built right on top of them called async/await.

JS Under the Hood: The Engine Room

Part 16 of 24

Ever wondered why your code actually runs? We’re going beyond the syntax to explore the V8 engine, memory management, and the "magic" that happens between your keyboard and the screen. Just deep dives.

Up next

String Polyfills and Common Interview Methods in JavaScript

Most developers use string methods like includes, slice, or replace daily. They work, so nobody questions them. That’s fine, until you hit an interview or a bug where you actually need to understand w