DEV Community

Purushotham Jakka
Purushotham Jakka

Posted on

Understanding Callbacks, Promises, and Async/Await in JavaScript

JavaScript is famous for being asynchronous. That means it doesn't wait around for slow tasks (like fetching data from a server) to finish before moving on. Instead, it uses special patterns to handle these tasks: callbacks, promises, and async/await. Let's break them down in plain English.

Callbacks: The Old School Way

A callback is just a function you hand over to another function, saying: "When you're done, call me back."

Example:

function getDataCallback(callback) {
  setTimeout(() => {
    callback(null, { user: "Alice" });
  }, 1000);
}

getDataCallback((error, result) => {
  if (error) {
    console.error("Error:", error);
  } else {
    console.log("Callback Result:", result);
  }
});
Enter fullscreen mode Exit fullscreen mode

Problem: If you need multiple steps (like fetch user -> then fetch posts -> then fetch comments), callbacks quickly become messy. This is called callback hell.

Promises: A Cleaner Deal

A promise is like an IOU for a future value. It says: "I promise I'll give you the data later, or I'll tell you why I failed."

Example:

function getDataPromise() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve({ user: "Alice" });
    }, 1000);
  });
}

getDataPromise()
  .then((result) => {
    console.log("Promise Result:", result);
  })
  .catch((error) => {
    console.error("Promise Error:", error);
  });
Enter fullscreen mode Exit fullscreen mode

Promises let you chain multiple steps without nesting too deeply.

Async/Await: The Modern Way

Async/await makes asynchronous code look synchronous. It's built on top of promises but feels more natural to read.

Example:

async function getDataAsync() {
  try {
    const result = await getDataPromise();
    console.log("Async/Await Result:", result);
  } catch (error) {
    console.error("Async/Await Error:", error);
  }
}

getDataAsync();
Enter fullscreen mode Exit fullscreen mode

With await, you can write code that looks like normal step-by-step instructions, but it still runs asynchronously under the hood.

Conclusion

Callbacks, promises, and async/await are just different ways of handling asynchronous tasks in JavaScript.

  • Callbacks are the foundation (Simple but messy when chaining many steps).
  • Promises improved readability (Cleaner, with .then() and .catch()).
  • Async/await is the modern, elegant solution (Most readable, looks like synchronous code).

If you're writing new code today, async/await is usually the best choice.

Top comments (0)