Introduction:
Asynchronous programming is an important aspect of modern web development, allowing us to perform long-running tasks without blocking the main thread and causing the user interface to freeze. In JavaScript, there are several ways to write asynchronous code, including using callbacks, promises, and the async/await syntax. In this post, we’ll take a look at the latter two approaches and how they can make our asynchronous code easier to write and understand.
What are Promises?
A Promise is an object that represents the eventual result of an asynchronous operation. It can be in one of three states: pending, fulfilled, or rejected. When a Promise is created, it is in the pending state. Once the asynchronous operation has completed, the Promise is either fulfilled with a value or rejected with an error.
Here’s an example of a Promise that fetches data from a server:
To use this Promise, we can call the fetchData
function and use the then
and catch
methods to handle the resolved value or rejected error:
Promises provide a clean and concise way to handle asynchronous operations, but they can still be somewhat cumbersome when we need to chain multiple asynchronous operations together. This is where the async/await syntax comes in.
Async/Await Syntax
The async/await syntax is a modern way to write asynchronous code that uses Promises under the hood. It allows us to write asynchronous code that looks and behaves like synchronous code, making it easier to understand and debug.
To use async/await, we simply declare a function with the async
keyword and use the await
keyword inside the function to wait for a Promise to be resolved. Here’s our fetchData
example rewritten with async/await:

To use this async function, we can call it in the same way as a regular synchronous function:
fetchData
the function now returns the resolved value directly, rather than wrapping it in a Promise.Error Handling with Async/Await
One of the benefits of using async/await is that it makes error handling easier. With Promises, we need to use the catch
method to handle errors. With async/await, we can use a try
/catch
block just like we would in a synchronous function.