Explaining async/await using promises


Promise

Resolve

Calling Promise.resolve with a value:

Promise.resolve('value');

Is the same as instantiating a Promise with a fulfilled value in the callback function:

new Promise(resolve => {
  resolve('value');
});

Reject

Calling Promise.reject with a reason:

Promise.reject('reason');

Is the same as instantiating a Promise with a rejected reason in the callback function:

new Promise((resolve, reject) => {
  reject('reason');
});

Async/Await

Async Function

An async function is declared with async in front of the function:

async function () {};

Which is similar to the async arrow function:

async () => {};

When an async function is invoked, it returns a Promise:

(async () => {})() instanceof Promise; // true

Comparison

Fulfilled

Async/await is the syntactical sugar that makes promises look synchronous (but it’s actually not):

(async () => {
  const result = await Promise.resolve('value');
  console.log(result); // 'value'
})();

This is equivalent to:

Promise.resolve('value').then(result => {
  console.log(result); // 'value'
});

For a fulfilled promise, you can think of await as the then() method in the promise chain.

Rejected

When a promise is rejected inside an async function, you can handle it with a try…catch:

(async () => {
  try {
    await Promise.reject('reason');
  } catch (error) {
    console.log(error); // 'reason'
  }
})();

This is the same thing as:

Promise.reject('reason').catch(error => {
  console.log(error); // 'reason'
});

For a rejected promise, you can think of the catch block as the catch() method in the promise chain.



If you enjoyed this post, please consider supporting this site!