async函数一定返回promise对象:return值等价于promise.resolve(值),throw等价于promise.reject(错误),无return则默认promise.resolve(undefined);必须用await(在async内)或.then()获取结果,错误需try/catch或.catch()捕获。

直接说清本质,不绕弯子,是高效回答 async/await 面试题的关键。面试官想确认的不是你背了多少定义,而是你是否真正理解它的运行机制、返回行为和错误处理逻辑。
async 函数到底返回什么?
它一定返回一个 Promise 对象,哪怕函数体里写的是 return 123 或者干脆没写 return。
- return 一个普通值 → 等价于 Promise.resolve(值)
- throw 一个错误 → 等价于 Promise.reject(错误)
- 没写 return → 默认返回 Promise.resolve(undefined)
所以调用 async 函数后,不能直接拿到结果,必须用 .then() 或再套一层 await(在另一个 async 函数里)。
await 到底在等什么?
await 等的不是一个“函数”,而是一个表达式的计算结果。这个结果可以是:
- 一个 Promise(最常见),它会等这个 Promise settle(fulfilled 或 rejected)
- 一个普通值(比如数字、字符串、对象),这时 await 会立即把它包装成 Promise.resolve(值),然后继续执行
关键点:await 总是让当前 async 函数暂停,并把后续代码推入微任务队列,所以它后面的语句不会立刻执行——哪怕等的是一个同步值。
错误怎么捕获才稳妥?
两种方式都对,但适用场景不同:
- 用 try/catch 包裹 await 表达式:适合需要立即响应错误、做差异化处理(比如重试、降级、记录日志)的场景
- 用 .catch() 处理 async 函数的返回值:适合统一兜底、不想在函数内部写太多控制流的情况
注意:try/catch 能捕获 await 后 Promise 的 reject,也能捕获 await 后面同步代码抛出的错误(比如 JSON.parse() 报错),这是它比 Promise.catch 更强的地方。
为什么不能在顶层直接 await?
因为 await 只能在 async 函数内部使用,这是语法限制。想在模块顶层用,得用 top-level await(ES2022+ 支持),但要注意它只在模块作用域有效,且会影响模块加载顺序。
如果环境不支持,常见做法是包一层立即执行的 async 函数:;(async () => { await fetchData(); })();











