What does an async function return?
Always a Promise. A returned value becomes the fulfilled value, and a thrown error becomes a rejection. That is true even when the function contains no await.
Explain it simply
Putting async in front of a function is like telling the customer, "I'll give you a token, not the food." Whatever you return inside is wrapped into a promise automatically, and anything you throw becomes a rejected promise.
So the caller cannot read the value directly. They must use .then(...) or await it from another async function.
Returning another promise from an async function is fine too: it is unwrapped, so you get one promise, not a promise of a promise.
Example
async function one() { return 1; }
async function boom() { throw new Error("x"); }
console.log(one() instanceof Promise); // Output: true
one().then((v) => console.log(v)); // Output: 1
boom().catch((e) => console.log(e.message)); // Output: x
async function viaAwait() {
const v = await one();
return v + 1;
}
viaAwait().then(console.log); // Output: 2The true prints first, since it runs synchronously; the other lines follow in order.
What to say in the interview
"An async function always returns a promise. A normal return fulfills it, a thrown error rejects it. Callers need then or await to read the value. await can only be used inside an async function or at the top level of a module."
Common mistakes
- Using the return value of an async function directly, such as if (checkUser()), which is always truthy because a Promise is an object.