async函数无await时仍同步执行函数体,但返回值必为Promise,不能直接返回原始值或同步抛错,本质是“同步执行+自动Promise化”。

是的,async 函数中如果没有 await,它会同步执行完函数体,但整体仍返回 Promise,并不会变成“普通同步函数”。
关键要分清两个层面:
- 函数体内部的执行顺序(是否阻塞)
- 函数的返回值和调用行为(是否异步)
async 函数没有 await 时,内部是同步执行的
函数体从上到下逐行运行,不暂停、不交出控制权。例如:
async function foo() {
console.log('start');
console.log('middle');
console.log('end');
return 'done';
}
console.log('before');
foo();
console.log('after');输出顺序是:
立即学习“Java免费学习笔记(深入)”;
before start middle end after
说明 foo() 内部三行 console.log 是立刻、同步、连续执行的,没等任何异步操作。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
但它仍是 async 函数,返回值永远是 Promise
即使没写 await,foo() 调用后也立即返回一个 pending 状态的 Promise,而不是直接返回 'done':
const p = foo();
console.log(p); // Promise {<pending>}
console.log(p instanceof Promise); // true如果想拿到 'done',必须用 .then() 或外层 await:
p.then(val => console.log(val)); // 'done'
为什么不能当普通函数用?
因为:
- 它无法通过
return直接返回原始值(总是被Promise.resolve()包装) - 它内部抛错不会中断主线程,而是让返回的 Promise 变成 rejected
- 它无法在非 async 函数中使用
await调用它并“等结果”,除非你显式处理 Promise
对比:普通函数 vs 无 await 的 async 函数
| 特性 | 普通函数 | 无 await 的 async 函数 |
|---|---|---|
| 执行方式 | 同步 | 同步执行函数体 |
| 返回值类型 | 任意(如 string、undefined) | 总是 Promise |
| 错误传播 | 直接 throw,可能崩溃 | 自动转为 rejected Promise |
| 是否可 await | 否 | 是(因为返回 Promise) |
所以,没 await ≠ 普通同步函数,只是“同步执行 + 自动 Promise 化”。
不复杂但容易忽略。

















