Asynchronous JavaScript: How to use async and await

Using JavaScript’s async and await functions makes for more readable and maintainable asynchronous code, but does have downsides

Let’s look at some new syntax introduced as a part of ES2017 to help organize code around promises. In many cases, this new syntax — namely the async and await keywords — will help you write more readable and maintainable asynchronous code, but it’s not without its drawbacks. We'll first look at how async and await can be used and then talk about some of the downstream implications of using it.

To start, we’ll lay out a simple example using promises and then refactor it to use async/await. In our example, we'll use axios, a promise-based HTTP library.

let getUserProfile = (userId) => {
  return axios.get(`/user/${userId}`)
    .then((response) => {
    .catch((error) => {
      // Do something smarter with `error` here
      throw new Error(`Could not fetch user profile.`);
  .then((profile) => {
    console.log('We got a profile', profile);
  .catch((error) => {
    console.error('We got an error', error)

Our code above defines a function that takes a user ID and returns a promise (the return type of axios.get().then().catch()). It calls an HTTP endpoint to get profile information and will resolve with a profile or reject with an error. This works fine, but there is a lot of syntax inside getUserProfile that clutters our actual business logic:

To continue reading this article register now