Async and Await

async and await were introduced in ES2017 to make an asynchronous code looks like a synchronous code (hiding the Promise underneath).

async

Put async before a function syntax to make it an async function, e.g.:

  • async function functionName() {...}
  • async () => {...}

An async function always returns a Promise. If an async function throws, then the Promise rejects. Inside an async function, you can use the await expression (explained below).

async function myFunction() {
  return 1;
}

const returnValue = myFunction();
console.log(returnValue); //=> <Promise>

// myFunction() returns a Promise
myFunction().then(value => {
  console.log(value); //=> 1
});

await

You can use the await expression ONLY inside an async function.

The await expression accepts a single Promise (or any value), and halts the execution of the code underneath until that Promise fulfills or rejects.

async function getJSON(url) {
  const response = await fetch(url);
  const body = await response.json();
  return body;
}

(async () => {
  const json = await getJSON('https://catfact.ninja/fact');
  console.log("Here's a cat fact:");
  console.log(json.fact);
})();

forawait loop

When you are iterating through an array of promises, you can use the for await syntax. (This can only be done in an async function.)

// Instead of writing:
for (const promise of promises) {
  const data = await promise;
  handle(data);
}

// You can use the for-await shorthand:
for await (const data of promises) {
  handle(data);
}

Trycatch with await

Note that unlike regular Promises, you can do trycatch with await as if they were a synchronous code.

async function getJSON(url) {
  try {
    const response = await fetch(url);
    const body = await response.json();
    return body;
  } catch (err) {
    console.error('Something wrong happened', err);
    return undefined;
  }
}

References

  • JavaScript: The Definitive Guide, 7th Edition (David Flanagan)Chapter 13. Asynchronous JavaScript