How to Use Async/Await in JavaScript: A Complete Guide for Beginners

How to Use Async/Await in JavaScript: A Complete 2025 Guide for Beginners

Async/Await in JavaScript is a modern way to handle asynchronous operations, making code more readable and easier to manage. Asynchronous programming is essential when working with API calls, file handling, or database queries. Traditionally, JavaScript used callbacks and Promises to manage async tasks, but with the introduction of async and await in ES2017, handling asynchronous code has become much simpler.

While Promises provide a structured way to handle async operations, Async/Await offers a more readable and cleaner alternative. If you’re wondering how Async/Await compares to Promises, check out our in-depth guide on JavaScript Async/Await vs Promises: 6 Reasons Why Async/Await is Better to understand why many developers prefer Async/Await over Promises.


What is Asynchronous Programming?

Asynchronous programming allows functions to run independently of the main execution thread, making the code non-blocking. In JavaScript, it’s used to handle time-consuming operations like fetching data from a server without freezing the browser.

Using callbacks or promises to handle async operations can be difficult to manage due to nesting issues, also known as “callback hell.” With async and await, handling async code becomes more straightforward.


What is async and await?

  • async: A function declared with the async keyword always returns a promise. You can use await inside it to wait for another asynchronous operation to complete.
  • await: This keyword is used to wait for a promise to resolve or reject inside an async function. It pauses the function execution until the promise settles and then resumes with the result.
async function myAsyncFunction() {
  try {
    let result = await someAsyncOperation();
    console.log(result);
  } catch (error) {
    console.error(error);
  }
}

In this example:

  • The function myAsyncFunction is declared as async.
  • Inside the function, we use await to pause the execution until someAsyncOperation() completes.

Step-by-Step Guide to Using Async/Await in JavaScript

1. Declaring an Async Function

You declare an async function by adding the async keyword before the function declaration.

async function fetchData() {
  // function body
}

2. Using Await Inside Async Functions

To make an asynchronous operation wait for its result, use the await keyword. It can only be used inside an async function.

async function getData() {
  let response = await fetch('https://api.example.com/data');
  let data = await response.json();
  return data;
}

Here, the fetch() API call is asynchronous. The function execution is paused until the promise returned by fetch is resolved.

3. Error Handling with Async/Await

One of the biggest advantages of Async/Await in JavaScript is improved error handling. Instead of chaining .catch(), you can use a try...catch block:

async function getData() {
  try {
    let response = await fetch('https://api.example.com/data');
    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    let data = await response.json();
    return data;
  } catch (error) {
    console.error('Fetch error:', error);
  }
}

If the fetch request fails, the error is caught in the catch block, making Async/Await in JavaScript a more intuitive way to manage async errors.

4. Using Multiple Awaits

You can use multiple await statements inside an async function. This makes Async/Await in JavaScript more structured when handling multiple asynchronous operations sequentially.

async function getData() {
  let user = await fetchUser();
  let posts = await fetchPosts(user.id);
  return { user, posts };
}

This example first waits for the fetchUser call to finish before proceeding to the fetchPosts function.

5. Returning Values from Async Functions

Async functions always return a promise. The resolved value of the promise is the value you return from the async function.

async function fetchData() {
  return 'Hello World';
}

fetchData().then(console.log);  // Output: 'Hello World'

Common Use Cases of Async/Await

  • Fetching data from APIs: Async/await is commonly used for making HTTP requests to APIs using fetch or libraries like Axios.
  • Database queries: Async/Await in JavaScript helps handle database operations in MongoDB, MySQL, or Firebase.
  • File handling: The fs.promises API allows working with files using Async/Await in JavaScript for cleaner code.

Benefits of Using Async/Await

  1. Cleaner Code: Using async/await makes your asynchronous code look more like synchronous code, improving readability.
  2. Easier Error Handling: try...catch blocks make error handling more intuitive compared to chaining .catch() with Promises.
  3. Avoids Callback Hell: Async/await helps avoid deeply nested callbacks, which makes code more maintainable.
  4. Improved Readability: The syntax of Async/Await in JavaScript is easier to follow, reducing confusion.
  5. Better Error Handling: Instead of using .catch() blocks for promises, you can use the traditional try...catch for handling errors in async/await functions.
  6. Avoiding Promise Chaining: Async/await eliminates the need for multiple .then() statements, reducing the potential for “promise hell.”

Limitations

  • Browser Compatibility: Async/await is not supported in Internet Explorer. For older environments, you’ll need to use a transpiler like Babel.
  • Blocking Behavior: Since await blocks the execution of an async function, overusing it can slow down your code if not used carefully.

Example of Using Async/Await with API

async function getUserData(userId) {
  try {
    const response = await fetch(`https://api.example.com/users/${userId}`);
    if (!response.ok) {
      throw new Error('User not found');
    }
    const data = await response.json();
    return data;
  } catch (error) {
    console.error(error.message);
  }
}

getUserData(1).then(userData => {
  console.log(userData);
});

This code fetches user data from an API using Async/Await in JavaScript. If the user is not found, an error is thrown and caught in the catch block.


Frequently Asked Questions (FAQs)

1. What is async and await in JavaScript?
Async and await are used to handle asynchronous code in a more readable way, making it look synchronous. Async functions return a promise, and await pauses the function execution until a promise resolves.

2. Can I use await outside of an async function?
No, await can only be used inside an async function. If you try to use it outside of an async function, JavaScript will throw a syntax error.

3. How do I handle errors in async/await?
You can use try...catch blocks to handle errors in async/await. If an awaited promise is rejected, the code in the catch block will execute.

4. What happens if I don’t use await with a promise?
If you don’t use await, the async function will return a promise that you can handle later using .then() and .catch().


Conclusion

Async/Await in JavaScript is a game-changer for handling asynchronous code. It improves readability, simplifies error handling, and avoids callback hell. Whether fetching data from an API or managing async tasks, mastering Async/Await in JavaScript will significantly enhance your development workflow.

Use async/await in your projects to simplify error handling, avoid callback hell, and make your asynchronous code more maintainable.

Scroll to Top