An async function always returns a promise

Marking a function async changes its return value regardless of what the body does, which is obvious stated plainly and is the source of most confusion about them.

async function total() {
  return 4900;
}

total();              // Promise { 4900 }, not 4900
await total();        // 4900
total().then(n => n); // 4900

So adding async to an existing function to use await inside it is a breaking change for every caller, and the callers do not error — they get a Promise where they expected a number and carry on. A throw inside an async function rejects the returned promise rather than propagating, which is the same change viewed from the failure side.