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.