Back to Web Development
2026-02-205 min read

async function expression (Web Development)

Learn async function expression (Web Development) step by step with clear examples and exercises.

Why This Matters

Async function expressions play a crucial role in modern web development by simplifying the process of handling asynchronous tasks such as fetching data from APIs or making server requests. With the await keyword, they allow us to write cleaner and more readable code that pauses the execution of an asynchronous function until a promise is resolved. This not only improves code organization but also helps prevent common errors associated with traditional callback-based asynchronous programming.

Prerequisites

Before diving into async function expressions, it's essential to have a strong understanding of the following:

  1. JavaScript ES6 features like arrow functions, template literals, and destructuring assignments.
  2. Promises and their lifecycle (pending, fulfilled, rejected). Familiarity with how promises work is crucial for understanding how await operates within async functions.
  3. Basic concepts of asynchronous programming in JavaScript, including callbacks, promises, and event loops.
  4. Understanding the difference between synchronous and asynchronous code execution.

Core Concept

An async function expression is defined using the async keyword followed by a function name (optional) and the function body. The body can contain one or more await expressions, which pause the execution of the function until the promise they are waiting on is resolved.

// Async function expression without a name
const asyncFunction = async () => {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
}

// Async function expression with a name
async function myAsyncFunction() {
const response = await fetch('https://api.example.com/data');
const data = await response.json();
console.log(data);
}

In the examples above, we have defined two async function expressions: one without a name and one with a name myAsyncFunction. Both functions fetch data from an API and log it to the console after converting it to JSON.

Understanding Promises within Async Functions

Async functions automatically return a Promise that is either resolved with the result of the function or rejected if an error occurs. This allows us to use await within the function to pause its execution until a specific promise is resolved, making asynchronous code easier to read and manage.

Worked Example

Let's create an async function expression that fetches user data from an API and logs it to the console:

const getUserData = async () => {
const response = await fetch('https://api.example.com/user');
const user = await response.json();
console.log(user);
}

getUserData();

In this example, we have defined an async function expression called getUserData. It fetches user data from the API and logs it to the console once the data is available. When you run this code, it will execute immediately but won't log anything until the fetch request is completed.

Common Mistakes

  1. Forgetting the await keyword: Without the await keyword, async functions will not pause and wait for the promise to resolve. This can lead to unintended behavior or race conditions.
const getUserData = async () => {
const response = fetch('https://api.example.com/user');
const user = response.json(); // No await here!
console.log(user);
}
  1. Not handling errors: It's important to handle errors that may occur during the execution of an async function. You can use a try...catch block to catch and handle any errors that might be thrown by promises.
const getUserData = async () => {
try {
const response = await fetch('https://api.example.com/user');
const user = await response.json();
console.log(user);
} catch (error) {
console.error('Error fetching user data:', error);
}
}
  1. Misunderstanding the order of operations: When using multiple await expressions within an async function, it's important to remember that JavaScript will execute them in the order they appear in the code. This means that if you have dependencies between your promises, you may need to reorder your await statements or use additional logic to ensure proper execution.

Common Mistakes - Subheadings

  • Not returning a Promise: If an async function does not explicitly return a Promise, it will still be asynchronous but won't pause at the await statements.
  • Misusing async/await with synchronous code: Using async and await with synchronous functions can lead to unexpected behavior, as they do not provide any benefits in that context.

Practice Questions

  1. Write an async function expression that fetches data from https://api.example.com/data and logs it to the console after converting it to JSON.
  2. Given the following code, what will be logged to the console when you run it?
const getData = async () => {
const response1 = await fetch('https://api.example.com/data1');
const data1 = await response1.json();

const response2 = await fetch('https://api.example.com/data2');
const data2 = await response2.json();

console.log(data1, data2);
}

getData();
  1. Write an async function expression that fetches user data from https://api.example.com/user and logs the user's name to the console if it exists in the response data.
  2. Given the following code, what will be logged to the console when you run it?
const getData = async () => {
const response1 = fetch('https://api.example.com/data1');
const data1 = response1.json(); // No await here!

const response2 = fetch('https://api.example.com/data2');
const data2 = response2.json(); // No await here!

console.log(data1, data2);
}

getData();

FAQ

What happens if I have multiple await expressions within an async function, but they don't depend on each other?

  • JavaScript will execute them in the order they appear in the code, pausing the execution of the function until each promise is resolved before moving to the next one.

Can I use async and await with promises that are not returned from a function?

  • No, you must return a Promise from an async function for the await keyword to work correctly. If you don't return a promise, the function will still be asynchronous but won't pause at the await statements.

Is it possible to use async and await with promises that are not fetches or XMLHttpRequests?

  • Yes! The await keyword can be used with any promise, whether it comes from a fetch request, an XMLHttpRequest, or even a custom Promise implementation.

What is the difference between an async function and a regular function when it comes to asynchronous behavior?

  • A regular function is not inherently asynchronous, but an async function automatically returns a Promise that is either resolved with the result of the function or rejected if an error occurs. This allows us to use await within the function to pause its execution until a specific promise is resolved.
async function expression (Web Development) | Web Development | XQA Learn