JAVASCRIPT GUIDE
Promises vs async/await in JavaScript
By the HireReadyAI team · Last updated 6 October 2026 · 8 min read
Same foundation, different syntax — and how errors propagate in each style.
Same foundation
async/await is syntactic sugar over Promises. An async function always returns a Promise. await pauses the async function's execution until that Promise settles, without blocking the JavaScript thread from running other tasks.
Syntax and readability
Promise chains shine for short pipelines. async/await shines when you have branching, loops, or try/catch around several steps. Prefer the style that makes control flow obvious to the next reader — including interviewers reading your screen share.
Error propagation
Rejected promises skip to the next .catch. await throws into the surrounding try/catch of an async function. Forgetting to await a rejecting promise is a common bug: the function continues and the rejection becomes unhandled. Always await (or explicitly void with a catch) every Promise that can fail.
Sequential vs parallel
// sequential — each waits
const a = await fetchA();
const b = await fetchB();
// parallel — start together
const [a, b] = await Promise.all([fetchA(), fetchB()]);
Interviewers listen for whether you accidentally serialize independent I/O. Use Promise.all for independent tasks, Promise.allSettled when you need every result even if some fail, and Promise.race for timeouts.
Myths to avoid
- Myth: await blocks the entire Node process. Reality: only that async function's continuation waits.
- Myth: async functions run on a new thread. Reality: still the same event-loop thread unless you use worker threads.
- Myth: .then is obsolete. Reality: it is still useful for concise pipelines and library APIs.
A crisp interview answer
async/await is Promise syntax that makes asynchronous code read like synchronous code. I use await with try/catch for sequential steps and Promise.all when work is independent. I am careful to await every Promise so errors do not become unhandled rejections.