Back to results for “Async await”
Node.js › Async Patterns

How does async/await relate to Promises under the hood, and what does 'await' actually do to program execution?

Intermediate

Answer

async/await is syntactic sugar built directly on top of Promises -- an async function always implicitly returns a Promise, and 'await' pauses execution of that specific async function (without blocking the rest of the event loop) until the awaited Promise settles, then either returns its resolved value or throws its rejection reason as a regular JavaScript exception, which is why try/catch works naturally with awaited code in a way it never could with raw .then() chains.
async function getUserData(id) {
  try {
    const user = await fetchUser(id); // pauses this function only, not the whole program
    const posts = await fetchPosts(user.id);
    return { user, posts };
  } catch (err) {
    console.error('Failed to load user data:', err.message);
    throw err;
  }
}
Real-world example A team migrating a callback-heavy codebase to async/await finds their error handling becomes dramatically simpler, since a single try/catch block now correctly captures errors from multiple sequential awaited calls, replacing what had been several separate error-first callback checks scattered through nested functions.

Common follow-ups: What happens if you forget the 'await' keyword before a promise-returning call inside an async function?;Why does an unhandled rejection inside an async function not crash the process the same way a synchronous throw would, without additional handling?